我设置了一个数据库,其中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'作为标签的媒体项的查询。
答案 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;