Eu fiz uma pergunta antes, mas meio que errei, então estou reformulando-a novamente aqui.
Tenho 3 tabelas relacionadas:
media
media_tags
(mesa de bridge)tags
Aqui está o código que tenho até agora:
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
Isso está chegando muito perto do que eu quero, mas não está muito correto. Imagine que há esses registros de mídia:
- Mídia 1 com estas tags: cão, pássaro, ovelha, cavalo
- Mídia 2 com estas tags: cão, gato, vaca
- Mídia 3 com estas tags: gato, cavalo, coelho
- Mídia 4 com estas tags: vaca, cavalo, ovelha
Minha consulta acima retorna Media 1, 2 e 3, mas as tags mostradas consistem apenas em dog
& cat
. O que eu quero é que tags
sempre contenha TODAS as suas tags se houver alguma correspondência com qualquer um dos valores na matriz. Então, se ['dog','cat'] estiverem na consulta, então Media 1, 2 e 3 devem ser retornados com todas as suas respectivas tags, mas Media 4 não deve porque não há correspondência.
Sinto que estou bem perto de uma solução, mas não consigo descobri-la.