查找拥有全部值的ID(mySQL,SQL)

6

想象一下这样的一个表格

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,这两个值都同时具有值2和5;或者如果我提供值1和3,我应该得到100和104。
如何只用一个SQL命令实现这一点?我需要尽可能轻量的查询。
使用UNION、INTERSECTION或嵌套SQL,哪一个更快、更慢、更重等?
提前感谢 Ergec

谢谢大家,我开始测试查询以找到最快和最轻的一个。看起来Rufinus的查询是最快的。20,000条记录,1006个结果 Jhonny平均0.0045秒 David平均0.0020秒 Rufinus平均0.0010秒(我从未想过用这种方式:))我对新建议持开放态度。 - Ergec
尽管Rufinus的答案是最快的,但我会选择David的答案。它足够快速和灵活,这样我就可以使用AND和OR来分组值。 - Ergec
3个回答

7

试试这样做:

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 - 查找匹配所有连接表中的行


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

0
这是我实现它的方式:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接