假设我有一个SQL表 table1
+--------------------------+
| id | person | eats |
+----+--------+------------+
| 1 | 1 | apple |
| 2 | 3 | banana |
| 3 | 2 | orange |
| 4 | 1 | strawberry |
| 5 | 2 | grapes |
| 6 | 4 | apple |
+----+--------+------------+
Run Code Online (Sandbox Code Playgroud)
我希望得到所有吃饭的人apple并说出来strawberry.
我试过了
select person
from table1
where eats in( 'apple', 'strawberry' )
Run Code Online (Sandbox Code Playgroud)
但是这个查询返回1, 1, 4,我猜是因为它正在检查apple并且strawberry单独进行.
怎样才能让所有吃过的apple人和strawberry?
SELECT person
FROM table1
WHERE eats IN( 'apple', 'strawberry' )
GROUP BY person
HAVING COUNT(DISTINCT eats)=2
Run Code Online (Sandbox Code Playgroud)
更新对我来说,查询解释了自己.但既然你要求解释我们一起试试:
您的原始查询返回此结果:
1
1
4
Run Code Online (Sandbox Code Playgroud)
但是你不想得到1两次,这意味着你应该将结果分组person,这将我们带到下一个查询:
SELECT person
FROM table1
WHERE eats IN( 'apple', 'strawberry' )
GROUP BY person
Run Code Online (Sandbox Code Playgroud)
将返回:
1
4
Run Code Online (Sandbox Code Playgroud)
但你不想要person=4因为它只匹配apple,所以最简单的方法就是把它计算在一起eats就像是:
SELECT person, count(distinct eats)
FROM table1
WHERE eats IN( 'apple', 'strawberry' )
GROUP BY person
Run Code Online (Sandbox Code Playgroud)
那么我们有这个结果:
person count(distinct eats)
1 2
4 1
Run Code Online (Sandbox Code Playgroud)
我们准备过滤这个结果集,只得到那些有2个(苹果和草莓):
SELECT person, count(distinct eats)
FROM table1
WHERE eats IN( 'apple', 'strawberry' )
GROUP BY person
HAVING count(distinct eats) = 2
Run Code Online (Sandbox Code Playgroud)
这将返回:
person count(distinct eats)
1 2
Run Code Online (Sandbox Code Playgroud)
但你没有要求count这就是为什么我count(distinct eats)从SELECTed字段列表中删除了部分.
http://sqlfiddle.com/#!9/ea612/6