我有兩個SQL表,'products'和'tags'。他們有一個n:m的關係,使用第三個表'product_tags'。mysql n:m關係:查找具有幾個特定關係的行
我想用一個查詢來查找每一個有一些特定的標籤的產品。例如,發現有一個相對於標籤1,23和54
有沒有辦法只有一個查詢做到這一點每一個產品?
我有兩個SQL表,'products'和'tags'。他們有一個n:m的關係,使用第三個表'product_tags'。mysql n:m關係:查找具有幾個特定關係的行
我想用一個查詢來查找每一個有一些特定的標籤的產品。例如,發現有一個相對於標籤1,23和54
有沒有辦法只有一個查詢做到這一點每一個產品?
您可以使用此解決方案。這得到包含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
列表項的數目,這樣你就可以相應地調整基於標籤的量,你想要檢查。
試試這個
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)
我假設的列名。我認爲列名很簡單,你可以很容易地使用你的列名。如果你需要更多的澄清,讓我知道。
請告訴需要COUNT(1)= 3 – Narendra 2012-07-10 09:14:07
它工作完美,如果我用以下代替HAVING子句:'HAVING COUNT(b.tag_id)= 3'並添加一個'GROUP BY a.id' – Majiy 2012-07-10 09:14:07
COUNT背後的原因是,WHERE IN(...)並不在乎方括號內有多少元素匹配。如果沒有COUNT,結果將是「每個產品都有任何標籤」,而不是「每個產品都有完全的標籤」。 – Majiy 2012-07-10 09:25:24