一連の記事を参照するテーブルがあり、テーブルにはそれらの記事のタグが含まれています。このような:
tag text
article_id bigint
tag1、tag2、tag3 などの一連のタグを持つすべての article_id を選択したいのですが、記事には 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用です。