【发布时间】:2012-03-28 10:18:13
【问题描述】:
我有一个引用一堆文章的表,该表包含这些文章的标签。像这样:
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
标签: sql postgresql sql-match-all relational-division