Tags SQL查询:如果行在相关表中具有所有相关选项,则选择该行

Tags SQL查询:如果行在相关表中具有所有相关选项,则选择该行,tags,relation,sql,Tags,Relation,Sql,给定一个表定义: Articles: art_id | name -------|-------------- 1 | article1 2 | article2 3 | article3 Tags: tag_id | description -------|-------------- 1 | Scientific 2 | Long 3 | Short article_tags: art_id

给定一个表定义:

Articles:
 art_id | name  
 -------|--------------
  1     | article1
  2     | article2
  3     | article3

Tags:
  tag_id | description
  -------|--------------
   1     | Scientific
   2     | Long
   3     | Short

article_tags:
  art_id | tag_id
  -------|---------
   1     | 1
   1     | 2
   2     | 1
   2     | 3
   3     | 1
   3     | 2
   3     | 3
问题是如何选择既科学又简短的所有文章

请注意,它应该是[2..N)标签组合的通用


谢谢您的帮助。

您可以使用以下查询获得结果:

select a.art_id, a.name
from articles a
inner join article_tags at
  on a.art_id = at.art_id
inner join tags t
  on at.tag_id = t.tag_id
where t.description in ('Short', 'Scientific')  -- tags here
group by a.art_id, a.name
having count(distinct t.tag_id) = 2 -- total count of tags here

或者可以这样写:

select a.art_id, a.name
from articles a
inner join article_tags at
  on a.art_id = at.art_id
inner join tags t
  on at.tag_id = t.tag_id
group by a.art_id, a.name
having 
  sum(case when t.description = 'Short' then 1 else 0 end) >= 1 and
  sum(case when t.description = 'Scientific' then 1 else 0 end) >= ;

如果您只想返回文章id,则只需查询
article\u标签
表:

select art_id
from article_tags
where tag_id in (1, 3)
group by art_id
having count(distinct tag_id) = 2
请参见

请将您的sql标记替换为您正在使用的RDBMS(MySQL、sql Server、Oracle等)的特定sql标记。最佳答案取决于您正在使用的版本。可能重复的
SELECT    * 
FROM      articles 
WHERE     art_id IN 
          (
               SELECT    art_id 
               FROM      article_tags 
               GROUP BY  art_id 
               HAVING    COUNT(art_id) > 1
          )