2016-12-08 52 views
1

假設匹配標準選擇記錄我有一個SQL表table1在不同行

+--------------------------+ 
| id | person | eats  | 
+----+--------+------------+ 
| 1 | 1 | apple | 
| 2 | 3 | banana |  
| 3 | 2 | orange | 
| 4 | 1 | strawberry | 
| 5 | 2 | grapes | 
| 6 | 4 | apple | 
+----+--------+------------+ 

我想誰吃都applestrawberry的所有人員。

我試圖

select person 
from table1 
where eats in('apple', 'strawberry') 

但這查詢返回1, 1, 4,我的猜測是因爲,它是覈對applestrawberry seperately。

如何讓所有同時吃applestrawberry的人?

+0

同一個人可以有兩個蘋果行嗎? – jarlh

+0

編號表中將有每個人和水果的獨特條目 – mrid

回答

5
SELECT person 
FROM table1 
WHERE eats IN('apple', 'strawberry') 
GROUP BY person 
HAVING COUNT(DISTINCT eats)=2 

在更新對我來說,查詢解釋本身。但既然你問的解釋讓我們嘗試一起:

原始查詢返回結果如下:

​​

但你不希望得到兩次1,這意味着通過person你應該組的結果,帶來我們下一個查詢:

SELECT person 
FROM table1 
WHERE eats IN('apple', 'strawberry') 
GROUP BY person 

將返回:

1 
4 

但你不想person=4,因爲它僅匹配apple,所以要達到這個給我的simpliest的方法是計數明顯eats像:

SELECT person, count(distinct eats) 
FROM table1 
WHERE eats IN('apple', 'strawberry') 
GROUP BY person 

那麼,我們有這樣的結果:

person count(distinct eats) 
1  2 
4  1 

並且我們準備過濾此結果集以僅獲得具有2(蘋果和草莓)的那些人:

SELECT person, count(distinct eats) 
FROM table1 
WHERE eats IN('apple', 'strawberry') 
GROUP BY person 
HAVING count(distinct eats) = 2 

這將返回:

person count(distinct eats) 
1  2 

但你沒有爲count問,這就是爲什麼我從SELECT編輯的字段列表中刪除count(distinct eats)一部分。

http://sqlfiddle.com/#!9/ea612/6

+0

感謝@亞歷克斯:)只是一個簡短的問題。你能解釋一下這是如何工作的嗎? – mrid

+0

@mrid檢查更新回答:-) – Alex

+0

感謝您的解釋:)其實我對'GROUP BY person'部分感到困惑,'但是你不想兩次得到1,這意味着你應該按人物分組結果:爲什麼'獨特'在這裏工作? – mrid

3

集團通過person和只需要那些既記錄

select person 
from table1 
where eats in('apple', 'strawberry') 
group by person 
having count(*) = 2 
+0

LOL ...看起來像你輸入匆忙 – Rahul