要检查一个图像是否有两个不同的标记,需要跨行比较值,这反过来又建议聚合:
select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2)
group by m.id, m.name
having min(t.tag_id) <> max(t.tag_id)
查询过滤两个搜索的标记,按媒体聚合,并确保两个标记都存在。
id | name
-- | ----
1 | Media 1
如果要处理两个以上的标记,下面是一种更通用的方法:
select m.id, m.name
from medias m
inner join medias_taglinks t on t.media_id = m.id
where t.tag_id in (1, 2, 3, 4)
group by m.id, m.name
having count(*) = 4
假设没有重复
(media_id, tag_id)
having count(distinct t.tag_id) = 4
.
旁注:the
left join
似乎没有必要;如果要在媒体中搜索标记,无论如何都需要带上tab表。