我有一张photos
表、一张tags
表和一张桥表,分别称为photos_tags
。假设有一张照片被标记为dog
、cat
和bird
。这意味着 中有 1 行photos
, 中有 1 行tags
, 中有 3 行photos_tags
。
我正在尝试编写一条 SQL 语句,如果其中一个匹配,则获取所有 3 个标签。我到目前为止已经做到了这一点:
select distinct p.photo_id, t.tag from photos p
join photos_tags pt using (photo_id)
join tags t on pt.tag_id = t.tag_id and t.tag = 'dog'
但这仅返回包含 的行tag = 'dog'
。
有没有什么办法可以完成我想做的事情?
首先识别所有带有“狗”标签的照片,你已经这样做了,但我将为 CTE 重写
现在使用它来过滤您的查询以显示所有出现的
tags
内容:photo_id
@JNevill提供了一个答案,我将把它标记为正确的解决方案。为了完整起见,我还将分享我发现的另一种似乎有效的方法:
假设一个标准的多对多实现,我期望这是最快和最简单的:
只需做一次“绕罗西一圈”即可。
可以按如下方式进行: