SQL-запрос для выбора всех статей с заданными тегами из сводной таблицы

#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);