2012-06-20 49 views
3

我有4個表SQL查詢的四個表與MySQL - 「交集」

POST: 
id 

POST_TAG: 
post_id 
tag_id 
value 

TAG: 
id 

SEARCH: 
tag_id 
post_tag_value 

我需要查詢職位誰擁有所有標籤和值排在搜索表(不只是一個等於一個標籤):

編輯:抱歉不提供當前查詢和足夠的信息。

SELECT POST.id FROM POST,POST_TAG, SEARCH 
WHERE 
     POST.id = POST_TAG.post_id AND 
     POST_TAG.tag_id= SEARCH.tag_id AND 
     POST_TAG.value = SEARCH.value; 

它適用於如果SEARCH表有一行。問題是,什麼時候有更多。應該有更少的結果,但實際上有更多的(如果測試2行,正確的結果是被複制的行;我lookng爲路口沒有工會)

新增sqlfiddle:http://sqlfiddle.com/#!2/9cfb9/1

查詢的結果是'1','1','2'。它應該只有'1',因爲它有兩個'標籤',而'2'只有一個。

+4

太好了。讓我們來看看你到目前爲止有哪些查詢,有人會幫助你(將它編輯成你的問題,而不是將它添加到評論中)。 – halfer

+2

至少提供一些數據http://sqlfiddle.com –

+1

閱讀此問題的很多方法來做到這一點:[如何過濾SQL結果中有一個通過關係](http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-a-many-through-relation) –

回答

2

工作示例:http://sqlfiddle.com/#!2/393eb/39

SELECT pt.post_id 
FROM SEARCH s INNER JOIN post_tag pt ON pt.tag_id = s.tag_id AND pt.value = s.value 
GROUP BY pt.post_id 
HAVING COUNT(*) = (SELECT COUNT(*) FROM SEARCH) 

請注意,您在撥弄着ID爲0的職位應自返回以及它有(0,'yes')(1, 'yes')元組。

+0

取點,0和1應返回yes,所以這是正確的方法。 – gabberr

+0

謝謝,我很感激 – Sebas

2

根據您的sqlfiddle,答案可能是這樣的:

-- i want to select post that match to EVERY tag 
-- the result of example data should be only '1' 
SELECT POST.id as 'tag_id' 
FROM POST,POST_TAG, SEARCH 
WHERE 
     POST.id = POST_TAG.post_id AND 
     POST_TAG.tag_id= SEARCH.tag_id AND 
     POST_TAG.value = SEARCH.value 
GROUP BY POST.id 
having COUNT(distinct POST_TAG.tag_id) = (select count(distinct tag_id) from POST_TAG); 
+0

這項工作,而造成結果的UNION,而不是一個路口 – gabberr

+1

我想選擇匹配後的每個標籤 該示例數據的結果應該是唯一的「1」 http://sqlfiddle.com/#!2/ 393eb/1 – gabberr

+0

@ 2fingers我編輯了我的答案,你可以測試它。這是你想要的嗎? –