У меня есть таблица со ссылками на кучу статей, таблица содержит теги для этих статей. Нравится:
tag text
article_id bigint
Я хочу выбрать все article_id с набором тегов, скажем, 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.
EXPLAIN ANALZYE
- person a_horse_with_no_name   schedule 12.03.2012