查找未使用以下标记标记的项目

时间:2016-03-09 18:27:04

标签: mysql sql

我正在使用以下查询来查找包含所提供标签的所有项目,它的工作正常:

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”标签的组合。有人有建议吗?

1 个答案:

答案 0 :(得分:0)

使用having子句的技巧无法排除具有特定标记的项目,因此您需要采用不同的方法。实际上,如果没有having子句,第二个查询将返回更好的结果。

你仍然无法将innot 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子句对两者执行最终测试。