我有一个对象Product
,它有很多Tag
个。我想编写一个查询,给定一个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 :(得分: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)
答案 1 :(得分: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)
)