【问题标题】:Finding ID having all values (mySQL, SQL)查找具有所有值的 ID (mySQL, SQL)
【发布时间】:2009-08-10 13:23:56
【问题描述】:

想想这样的桌子

ID     Value    
100    1    
100    3    
101    1    
101    4    
102    2    
102    5    
103    2    
103    4    
104    1    
104    3    
105    2    
105    5

问题是,如果我给出值 2 和 5,我应该得到 102 和 105,而 102 和 105 同时具有值​​ 2 和 5,或者如果我给出值 1 和 3,我应该得到 100 和 104。

我怎样才能只用一个 sql 命令来做到这一点?我需要一个尽可能轻松的查询。

并使用 UNION、INTERSECTION 或 NESTED SQL,哪个更快、更慢、更重等?

提前致谢 尔格克

【问题讨论】:

  • 谢谢大家,我开始测试查询以找到最快和最轻的查询。看来Rufinus的查询是最快的。 20,000 条记录,1006 条结果 Jhonny 平均 0.0045 秒 David 平均 0.0020 秒 Rufinus 平均 0.0010 秒(我从没想过这样做 :))我愿意接受新的建议
  • 即使是强硬的 Rufinus 的回答也是我最快选择 David 的回答。它足够快且灵活,因此我可以使用 AND 和 OR 对值进行分组

标签: sql mysql


【解决方案1】:

有很多解决方案。除了 Jhonny 的解决方案,还可以使用 join

SELECT DISTINCT t1.id
FROM table t1, table t2
WHERE t1.id = t2.id
  AND t1.value = 2
  AND t2.value = 5

或使用相交

SELECT id FROM table WHERE value = 2

INTERSECT

SELECT id FROM table WHERE value = 5

【讨论】:

    【解决方案2】:

    试试这样的:

    SELECT id
      FROM test
    WHERE 
       value in (2,5)
    GROUP by id
    HAVING count(*) = 2
    

    如果你想测试它,简单的表(没有索引!):

    CREATE TABLE IF NOT EXISTS test (
      id int(4) NOT NULL,
      `value` int(4) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO test (id, value) VALUES
    (100, 1),
    (100, 3),
    (101, 1),
    (101, 4),
    (102, 2),
    (102, 5),
    (103, 2),
    (103, 4),
    (104, 1),
    (104, 3),
    (105, 2),
    (105, 5);
    

    几天前我有一个非常相似的问题。见MySQL - Find rows matching all rows from joined table

    【讨论】:

      【解决方案3】:

      这将是我实现它的方式:

      SELECT DISTINCT id
      FROM table 
      WHERE 
      id IN (SELECT id FROM table WHERE value = 2)
      AND 
      id IN (SELECT id FROM table WHERE value = 5)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-21
        • 2018-06-24
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        相关资源
        最近更新 更多