我之前问过一个问题,但有点搞乱了,所以我在这里再次重新表述一下。
我有 3 个相关表:
media
media_tags
(桥牌桌)tags
这是我目前拥有的代码:
SELECT m.media_id, m.name, array_agg(distinct t.tag) filter (WHERE t.date_deleted IS NULL) AS tags
FROM media m
LEFT JOIN media_tags mt USING (media_id)
LEFT JOIN tags t USING (tag_id)
WHERE m.date_deleted IS NULL AND t.tag = ANY(array['dog','cat'])
GROUP BY m.media_id, m.name
这与我想要的非常接近,但并不完全正确。想象一下这些媒体记录:
- 媒体 1 包含以下标签:狗、鸟、羊、马
- 媒体 2 带有以下标签:狗、猫、牛
- 媒体 3 带有以下标签:猫、马、兔子
- 媒体 4 带有以下标签:牛、马、羊
上面的查询确实返回了媒体 1、2 和 3,但显示的标签仅由dog
&组成cat
。我想要的是,tags
如果与数组中的任何值匹配,则始终包含其所有标签。因此,如果查询中包含 ['dog','cat'],则媒体 1、2 和 3 应返回其所有相应的标签,但媒体 4 不应返回,因为没有匹配项。
我感觉我已经接近找到解决方案了,但就是想不出来。