这应该适合你:
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
这仅返回键:
- 有
A
而且B
只有,没有别的所以key = 500
不应该被退回。但key = 100
应该包括在内。
- 只有
A
. 如key = 300
.
- has only
B
sokey = 600
不应该返回,因为它包含的值比B
is多一个w
。但key = 400
应该包括在内。
更新:这是如何工作的
如果任何键有一个值IN('A', 'B')
,那么它也可以包含其他值。
这就是我添加该HAVING
子句的原因:
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
对于每个值,通过使用相关子查询,将 与同一键的值COUNT(t1.value)
的总和进行比较。因此,如果当前键包含的值不是那么将不等于同一键的所有值。例如 key = 500 有一个 count = 3 但使用:COUNT
SELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.key
t1.value
'A', 'B'
COUNT(t1.value)
COUNT
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
没有该HAVING
子句也将包括它,因为它具有A'
或“B”。但是该HAVING
子句消除了这个键,因为它的计数 = 3 不等于 2。