2011-11-07 159 views
2

這是一個這樣的基本問題,但由於某種原因,我所有的SQL知識都剛剛退出大樓。三個基本表:MySQl返回與第二個表值匹配和/或的記錄

Table A 
id | name 
--------- 
1 | John 
2 | Mike 
3 | Henry 
4 | Cooper 

Table B 
id | tag 
--------- 
1 | chocolate 
2 | ice cream 
3 | cookies 

和聯接兩個表:

Table C 
id | name_id | tag_id 
--------------------- 
1 | 1 | 2 
2 | 1 | 3 
3 | 2 | 1 
4 | 3 | 2 
5 | 3 | 3 

我想找個誰都喜歡巧克力和餅乾的人。以下給我所有喜歡巧克力和餅乾的人,但我只想要喜歡兩者的人(巧克力和餅乾而不是巧克力或餅乾)。

SELECT name FROM tablea a JOIN tablec c ON a.id = c.name_id WHERE c.tag_id IN (1,3) 

下顯然是行不通的:

SELECT name FROM tablea a JOIN tablec c ON a.id = c.name_id WHERE c.tag_id = 1 AND c.tag_id = 3 GROUP BY name 

,但它本質上我想要的。另外,我想這樣做而不涉及JOIN中的tableb,因爲我在這裏使用它將會有不同的其他表加入,我不想混淆圖片。這一定非常簡單!

回答

4

一個hackish的方法:

SELECT name, COUNT(c.tag_id) AS cnt 
FROM tablea a 
JOIN tablec c ON a.id = c.name_id 
WHERE c.tag_id IN (1,3) 
GROUP BY name 
HAVING cnt = 2 

計數每個用戶多少偏好具有(這將通過where子句限於巧克力或餅乾),然後返回僅具有2所偏好的那些用戶。

+0

+1尼斯把戲:) – sll

+1

只要'表C'不能有重複的記錄(即'(name_id,tag_id)')的唯一約束,這看起來很棒 – Phil

+1

@Phill:我想有些人可以真的喜歡cookies,但至少在mysql中,你也可以有'COUNT(DISTINCT ...)處理這些蠢事。 –

2

最簡單和最快的方式是加入tablec兩次,一個是巧克力和其他的餅乾

select name 
    from tablea a 
inner join tablec chocolates on a.id = chocolates.name_id 
inner join tablec cookies on a.id = cookies.name_id 
where chocolates.tag_id = 1 
    and cookies.tag_id = 3 
+0

@Phil感謝指出重複的行。到'select distinct'。'Group by name'也可以做到這一點 –

+0

我回滾了我的最後一條評論,因爲這個查詢沒有返回重複的行,因此不需要明確的子句 –

相關問題