选择不同行中具有匹配条件的记录

mri*_*rid 1 mysql sql

假设我有一个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

Ale*_*lex 5

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