2016-06-09 65 views
0

我有一個對象Product有很多Tag s。我想編寫一個查詢,如果列表Tag ID僅在輸入列表中包含所有產品標籤時才返回Product。輸入列表可能包含不屬於產品組成部分的標籤ID,但沒關係,產品仍然可以退回(即,產品的所有標籤必須作爲輸入列表的子集存在,以包含在結果中)。如何只包含結果,如果輸入列表中存在所有相關的值

我能寫出1個查詢來完成這個任務,但我真的很希望能夠在沒有JOIN中的子查詢的情況下執行此操作。這是我的本錢:

SELECT * 
FROM product 
LEFT JOIN product_tag ON product_tag.product_id = product.id 
LEFT JOIN (
    SELECT product.id, COUNT(*) AS record_count 
    FROM product 
    LEFT JOIN product_tag ON product_tag.product_id = product.id 
    GROUP BY product.id 
) AS inner_q ON inner_q.id = product.id 
WHERE product_tag.id in (1, 2, 3) -- Sample Tag ids 
GROUP BY product.id 
HAVING COUNT(*) = inner_q.record_count 

回答

0

vkp導致我在正確的方向:

select * from product 
where id in 
(
select product_id 
from product_tag 
group by product_id 
having sum(case when id in (1, 2, 3) then 1 else 0 end) >= count(product_id) 
) 
1

這是否讓你所要的結果?

select * from product 
where id in 
(select product_id 
from product_tag 
group by product_id 
having sum(case when id in (1, 2, 3) then 1 else 0 end) >= 3) 
+0

差不多,但> = 3(大概是輸入列表中的數)使得它無法正常工作。如果一個產品只有2個標籤(比如id 1和2),它應該是不包括的 – Thelonias

+0

你的回答肯定讓我走上了正軌,我只需要調整它,這樣HAVING約束就是特定的計數產品所有的標籤 – Thelonias

相關問題