我有一个引用一堆文章的表,该表包含这些文章的标签。像这样:
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。