2012-07-10 105 views
0

我有兩個SQL表,'products'和'tags'。他們有一個n:m的關係,使用第三個表'product_tags'。mysql n:m關係:查找具有幾個特定關係的行

我想用一個查詢來查找每一個有一些特定的標籤的產品。例如,發現有一個相對於標籤1,23和54

有沒有辦法只有一個查詢做到這一點每一個產品?

回答

4

您可以使用此解決方案。這得到包含ALL關鍵字1,23和54的所有產品:

SELECT a.* 
FROM products a 
INNER JOIN product_tags b ON a.product_id = b.product_id 
WHERE b.tag_id IN (1,23,54) 
GROUP BY a.product_id 
HAVING COUNT(1) = 3 

3是您WHERE IN列表項的數目,這樣你就可以相應地調整基於標籤的量,你想要檢查。

+0

請告訴需要COUNT(1)= 3 – Narendra 2012-07-10 09:14:07

+0

它工作完美,如果我用以下代替HAVING子句:'HAVING COUNT(b.tag_id)= 3'並添加一個'GROUP BY a.id' – Majiy 2012-07-10 09:14:07

+0

COUNT背後的原因是,WHERE IN(...)並不在乎方括號內有多少元素匹配。如果沒有COUNT,結果將是「每個產品都有任何標籤」,而不是「每個產品都有完全的標籤」。 – Majiy 2012-07-10 09:25:24

0

試試這個

SELECT * FROM

PRODUCTS p 
JOIN PRODUCT_TAGS pt ON p.ID = pt.PRODUCT_ID 
JOIN TAGS t ON pt.TAG_ID = t.ID AND 
     t.ID IN (1, 23, 54) 

我假設的列名。我認爲列名很簡單,你可以很容易地使用你的列名。如果你需要更多的澄清,讓我知道。