#sql #postgresql #many-to-many
#sql #postgresql #многие ко многим
Вопрос:
У меня есть article
таблица и tag
таблица в PostgreQL 13. article
и tag
имеют отношение многие ко многим. Сводная таблица article_tag
создается со следующей схемой:
- FOREIGN KEY article_id REFERENCES article(id)
- FOREIGN KEY tag_id REFERENCES tag(id)
Теперь, учитывая список идентификаторов тегов (ID1, ID2, ID3 …), как я могу запросить все статьи с этими тегами? Я подумал об использовании чего-то вроде:
SELECT article_id FROM (
SELECT article_id FROM article_tag WHERE tag_id = ID2
) WEHRE tag_id = ID1;
Но если список идентификаторов тегов длинный, этот запрос будет вложен сложным образом.
Ответ №1:
Вы можете использовать агрегацию:
select article_id
from article_tag
where tag_id in (id1, id2, id3)
group by article_id
having count(*) = 3;
Обратите 3
внимание на размер in
списка. Вы также можете выразить это с помощью массивов, что упрощает запрос:
select article_id
from article_tag
where tag_id = any (:id_array)
group by article_id
having count(*) = cardinality(:id_array);