Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查找包含所有标记集的文章_Sql - Fatal编程技术网

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

SQL查找包含所有标记集的文章,sql,Sql,查找带有任何一组标记的文章是一个相对简单的连接,已经讨论过: 但是,如果我正在搜索,并且想查找包含所有标签集的文章,该怎么办 为明确起见,假设下表: 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` ( `se

查找带有任何一组标记的文章是一个相对简单的连接,已经讨论过:

但是,如果我正在搜索,并且想查找包含所有标签集的文章,该怎么办

为明确起见,假设下表:

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>)
基本上,如果相关标记的数量是预期值,则进行计数

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是applicated_标记的主键。如果不是,也就是说,你可以有重复的标签,所有的赌注都是无效的。

谢谢,这样更优雅。我想我可以通过从applicated_标记中选择article_id来加速它,其中tag_id==也可以。是的,我实际上对tag_id、article_id和article_id、tag_id都有唯一的索引。如果我有一个多对多表Actors_角色,另一个表包含一个角色列表,并且希望找到所有角色都在Roles中的Actors,那么上面这些表如何对应于我的表?这个问题一开始会是类似的吗?请参阅以获取解决我的问题的另一种方法。