首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过包括和排除其标记来选择项目

问通过包括和排除其标记来选择项目
EN

Stack Overflow用户
提问于 2019-03-05 20:30:24
回答 1查看 12关注 0票数 1

请考虑以下架构:

代码语言:javascript
复制
id | question
-----------
1  | How old are you?
2  | Are you a male or female?

question_tag:

id | question_id | tag_id
--------------------------
1  | 1       | 1
2  | 1       | 2
3  | 1       | 3
4  | 2       | 1
5  | 2       | 2

tags:

id | tag
--------------
1  | some_tag
2  | some_other_tag
3  | different_tag

问题和标签具有多对多的关系。

我想选择所有有特定标签而没有其他标签的问题。

例如,具有两个标签id 1、2但没有标签id 3的问题

我目前拥有的是:

代码语言:javascript
复制
select `questions`.`id`,
       `questions`.`question`,
from `questions`
       inner join `question_tag` on `questions`.`id` = `question_tag`.`question_id`
  where `tag_id` in (1,2)
group by `questions`.`id`, `questions`.`question`
having count(tag_id) = 2;

“包含”部分起作用了--我只得到两个标签都有的问题。

现在我需要添加‘排除’部分-例如,过滤我们的问题,也有tag_id = 3。

我尝试添加AND tag_id NOT IN (3)但没有成功-这些问题没有从结果中过滤掉。

知道我错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 20:33:50

您可以尝试将相关子查询与not exists一起使用

代码语言:javascript
复制
select `questions`.`id`,
       `questions`.`question`,
from `questions`
       inner join `question_tag` on `questions`.`id` = `question_tag`.`question_id`
  where  `tag_id` in (1,2) and not exists (select 1 from question_tag x where `question_tag`.`question_id`=x.`question_id` and x.tag_id=3)
group by `questions`.`id`, `questions`.`question`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55002874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档