2012-12-11 69 views
10

我有一個交叉引用表:MySQL的 - 選擇ID匹配的所有標籤

ID | tag 
1 | 4 
1 | 5 
1 | 6 
2 | 4 
2 | 5 
2 | 8 
3 | 2 

我需要選擇匹配一組標籤的所有的標識。例如,如果我獲得了標籤'4','5',我將獲得ID '1','2'。如果我給了標籤'4','2'我不會得到任何ID,因爲沒有與匹配的所有標籤。

而且,如果讓我來標記'4','9'那麼我應該也不會得到任何導致的ID,因爲'9'搜索將導致NULL值,因此沒有編號相符所有標籤。

過去兩天我一直拉我的頭髮。希望有人能幫助我。

+0

標籤' '4','8''應該給你'ID = 2'作爲結果,他們不應該嗎? –

+0

是的,你是對的。我的錯誤 - 讓我看看我能否修復它。 – user1113531

+1

也看到這個問題,超過10種方式來解決這個(常見)問題:** [如何過濾SQL結果在一個具有許多通過關係](http://stackoverflow.com/questions/7364969/how -to-filter-sql-results-in-a-many-through-relation)** –

回答

17

查詢的想法是,您需要將記錄數與您在WHERE子句中提供的值數匹配。

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(*) = 2 

如果標籤沒有被指定爲每一個ID唯一約束,那麼DISTINCT需要

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(DISTINCT tag) = 2 
+0

感謝您的快速響應和維護我的理智。這很好!對標籤有一個獨特的約束,所以第一個建議是完美的。 – user1113531

+0

不客氣':D' –

+0

我的英雄!我用20行查詢撕碎了我的頭髮,我所缺少的就是那部分,讚美! – NaturalBornCamper