【问题标题】:Select items by including & excluding their tags通过包含和排除标签来选择项目
【发布时间】:2019-03-05 12:30:23
【问题描述】:

考虑以下架构:

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

question 和 tag 有多对多的关系。

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

例如具有两个标签 ID [1,2] 但没有标签 ID [3] 的问题

我目前拥有的是:

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) 没有成功 - 这些问题没有从结果中过滤掉。

知道我错过了什么吗?

【问题讨论】:

    标签: mysql select tags


    【解决方案1】:

    您可以尝试使用不存在的相关子查询

    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`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多