想想这样的桌子
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
Run Code Online (Sandbox Code Playgroud)
问题是,如果我给出值2和5,我应该得到102和105,其中102和105同时具有值2和5,或者如果我给出值1和3,我应该得到100和104.
如何只使用一个sql命令执行此操作?我需要一个尽可能轻的查询.
并使用UNION,INTERSECTION或NESTED SQL,哪一个更快,更慢,更重等?
在此先感谢Ergec
尝试这样的事情:
SELECT id
FROM test
WHERE
value in (2,5)
GROUP by id
HAVING count(*) = 2
Run Code Online (Sandbox Code Playgroud)
如果你想测试它,简单的表(没有索引!):
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);
Run Code Online (Sandbox Code Playgroud)
几天前我有一个非常相似的问题.请参阅MySQL - 查找与连接表中的所有行匹配的行
有很多解决方案。除了 Jhonny 的解决方案之外,您还可以使用联接
SELECT DISTINCT t1.id
FROM table t1, table t2
WHERE t1.id = t2.id
AND t1.value = 2
AND t2.value = 5
Run Code Online (Sandbox Code Playgroud)
或者使用相交
SELECT id FROM table WHERE value = 2
INTERSECT
SELECT id FROM table WHERE value = 5
Run Code Online (Sandbox Code Playgroud)