SQL查找包含所有标记集的文章

时间:2009-09-09 15:39:39

标签: sql

使用任何一组标记查找文章是一个相对简单的联接,并且已经讨论过了:Best DB (MySQL) structure: Articles which contain favored tags

但是如果我正在搜索,并希望找到包含所有标签的文章呢?

对于特异性,假设如下表:

CREATE TABLE `articles` (
   `id` INT NOT NULL
);

CREATE TABLE `applied_tags` (
   `tag_id` INT NOT NULL,
   `article_id` INT NOT NULL
);

CREATE TABLE `search_tags` (
   `search_id` INT NOT NULL,
   `tag_id` TAG NOT NULL
);

我想出了这个,我认为可能有用,但是它很庞大,丑陋,有点不清楚,所以我认为必须有更好的方法:

Select articles.id from articles
where
 ( select count(*) from applied_tags
   where applied_tags.article_id == articles.id
     and applied_tags.tag_id in (select search_tags.tag_id from search_tags where search_tags.search_id == <input>) 
     ==
 (select count(*) from search_tags where search_tags.search_id == <input>)

(基本上,如果相关标签的数量是预期值,则计算。)

1 个答案:

答案 0 :(得分:7)

select article_id
from  applied_tags 
where tag_id in (<input tag set here>)
group by article_id
having count(*) = <count of input tags>

这应该这样做。我不会发誓这是最有效的方式,但它会做你想要的,假设tag_id + article_id是applied_tags的主键。如果不是(即你可以有重复的标签),所有的赌注都会关闭。