【问题标题】:How to fetch all rows which matches atleast one value from array?如何从数组中获取与至少一个值匹配的所有行?
【发布时间】:2016-03-21 11:02:57
【问题描述】:

我在数组中有如下值。

$findList = array(1,2,3,6);

我在数据库中有一个如下表。

id  sets
1    1                      
2    1,2
3    1,2,4
4    1,2,6
5    3,8,9
6    7,8,9
7    5,8,9

现在,我想查找所有具有数组 findList 值的所有行。

所以结果集应该有前五行。

我可以通过分解数组并为每个元素编写 OR 查询来做到这一点。有没有其他办法?

【问题讨论】:

  • 你可以试试IN()函数。
  • @Fred-ii- 需要更多咖啡吗?
  • 您可以尝试 FIND_IN_SET,但您会通过标准化获得更多乐趣。
  • 我认为 ^ 是我想说的,哈哈@Strawberry 当然,牛奶不加糖

标签: php mysql sql


【解决方案1】:

依靠 Lad2025 的 sqlfiddle 和来自 Pavel 的 Clever Answer

架构

CREATE TABLE tab(
   id   INTEGER  NOT NULL PRIMARY KEY 
  ,sets VARCHAR(6) NOT NULL
);
INSERT INTO tab(id,sets) VALUES (1,'1');
INSERT INTO tab(id,sets) VALUES (2,'1,2');
INSERT INTO tab(id,sets) VALUES (3,'1,2,4');
INSERT INTO tab(id,sets) VALUES (4,'1,2,6');
INSERT INTO tab(id,sets) VALUES (5,'3,8,9');
INSERT INTO tab(id,sets) VALUES (6,'7,8,9');
INSERT INTO tab(id,sets) VALUES (7,'5,8,9');

查询

-- 1,2,3,6 ... seek this

select * from tab 
WHERE CONCAT(",", `sets`, ",") REGEXP ",(1|2|3|6),";
+----+-------+
| id | sets  |
+----+-------+
|  1 | 1     |
|  2 | 1,2   |
|  3 | 1,2,4 |
|  4 | 1,2,6 |
|  5 | 3,8,9 |
+----+-------+

更好的是,请参阅上面关于数据标准化问题的 cmets。如果您这样做,您可能会获得索引的最佳使用。

【讨论】:

    【解决方案2】:

    还有其他方法吗?

    只是为了好玩,您可以在第一条评论中使用IN 子句。此代码不应在生产环境中使用:)

    SELECT *
    FROM tab
    WHERE id IN (SELECT id
                  FROM (
                    SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.sets, ',', n.n), ',', -1) AS val
                    FROM tab t 
                    CROSS JOIN 
                   (
                     SELECT a.N + b.N * 10 + 1 n
                       FROM 
                      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
                     ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
                    ) n
                     WHERE n.n <= 1 + (LENGTH(t.sets) - LENGTH(REPLACE(t.sets, ',', '')))
                    ) sub
                  WHERE val IN (1,2,3,6) 
    )
    

    SqlFiddleDemo

    输出:

    ╔═════╦═══════╗
    ║ id  ║ sets  ║
    ╠═════╬═══════╣
    ║  1  ║ 1     ║
    ║  2  ║ 1,2   ║
    ║  3  ║ 1,2,4 ║
    ║  4  ║ 1,2,6 ║
    ║  5  ║ 3,8,9 ║
    ╚═════╩═══════╝
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2021-02-22
      • 2019-09-22
      相关资源
      最近更新 更多