选择项目包含所有标签的位置,但没有任何不需要的标签

时间:2015-12-04 02:48:23

标签: sql sqlite

我设置了一个数据库,其中media个项目有很多tags,其关系通过media_tags表链接。我希望能够请求具有某些标签但没有某些其他标签的媒体项目。

例如,假设我想要所有标记为'vehicle'和'object'的项目,而不是标记为'truck'或'van'的项目。所以,如果我的数据是:

id | name           | tags
1  | Honda Civic    | object,vehicle,car
2  | Bucket         | object
3  | Ford Transit   | object,vehicle,van
4  | Ford Econoline | object,vehicle,truck
5  | Golf Ball      | object
6  | Toyota Camry   | object,vehicle,car

我希望查询返回本田思域和丰田凯美瑞,因为他们有“对象”和“车辆”标签,但他们没有“面包车”或“卡车”标签。

我已经想出如何做第一部分:

SELECT * FROM media
INNER JOIN media_tags ON media_tags.media_id = media.id
INNER JOIN tags ON (tags.id=media_tags.tag_id)
WHERE (tags.name = 'object' OR tags.name = 'vehicle')
GROUP BY media.id
HAVING COUNT(distinct media_tags.tag_id) = 2;

但我无法弄清楚如何编写一个忽略具有'truck'或'van'作为标签的媒体项的查询。

1 个答案:

答案 0 :(得分:1)

您可以添加这些行以排除带有额外标记的行:

SELECT * FROM media
INNER JOIN media_tags ON media_tags.media_id = media.id
INNER JOIN tags ON (tags.id=media_tags.tag_id)
WHERE (tags.name = 'object' OR tags.name = 'vehicle')
AND 0 = (
  SELECT COUNT(*)
  FROM tags as T1
  WHERE T1.id = media_tags.tag_id
  AND tags.name IN ('van','truck')
)
GROUP BY media.id
HAVING COUNT(distinct media_tags.tag_id) = 2;