我正在使用以下查询来查找包含所提供标签的所有项目,它的工作正常:
select items.*
from items
inner join item_tag on items.id = item_tag.item_id
where items.deleted_at is null and published = 1
and brand_id = 1
and item_tag.tag_id in (1,2,3)
group by items.id
having COUNT(DISTINCT item_tag.tag_id) = 3 order by id desc
我正在尝试创建一个查询,该查询返回未被提供的标记标记的所有项目,但它无法按预期工作。
select items.*
from items
inner join item_tag on items.id = item_tag.item_id
where items.deleted_at is null and published = 1
and brand_id = 1
and item_tag.tag_id not in (4,5,6)
group by items.id
having COUNT(DISTINCT item_tag.tag_id) = 0 order by id desc
查询还应该使用“in”和“not in”标签的组合。有人有建议吗?
答案 0 :(得分:0)
使用having
子句的技巧无法排除具有特定标记的项目,因此您需要采用不同的方法。实际上,如果没有having
子句,第二个查询将返回更好的结果。
你仍然无法将in
和not in
这样的条件结合起来。对于这种情况,我建议像这样的查询:
select items.*
from items
inner join (
select item_id, count(distinct tag_id) as matches
from item_tag
where tag_id in (1,2,3)
group by item_id
) as tags_in
on tags_in.item_id = items.id
left join (
select item_id
from item_tag
where tag_id in (4,5,6)
group by item_id
) as tags_out
on tags_out.item_id = items.id
where items.deleted_at is null
and items.published = 1
and items.brand_id = 1
and tags_in.matches = 3
and tags_out.id is null
因此,第一个连接获取具有应该存在的标记数量的项目,第二个连接获取具有禁用标记的项目。然后where
子句对两者执行最终测试。