У меня есть таблица, которая ссылается на кучу статей, таблица содержит теги для этих статей.Например:
tag text
article_id bigint
Я хочу выбрать все article_ids с набором тегов, скажем, tag1, tag2, tag3, но к статье также могут быть прикреплены теги tag4, tag5.
Я знаю, что это будет работать:
SELECT article_id
FROM tag WHERE tag='tag1'
INTERSECT
SELECT article_id
FROM tag
WHERE tag='tag2'
INTERSECT
SELECT article_id
FROM tag
WHERE tag='tag3'
И так будет:
SELECT article_id
FROM tag
WHERE tag IN ('tag1','tag2','tag3')
GROUP BY article_id
HAVING count(*) = 3
Но я не уверен, что это самый эффективный способ сделать это.Я также играл с приведенным ниже, но не могу заставить его работать в настоящее время.
SELECT array_agg(tag) as arr,
article_id
FROM tag
GROUP BY article_id
HAVING arr = {tag1,tag2,tag3}
Это просто казалось распространенной проблемой, с которой столкнутся другие, мне было интересно, является ли INTERSECT наиболее эффективным запросом вэтот случай.Это для PostgreSQL.