Выберите элементы, включая и исключая их теги - PullRequest
1 голос
/ 05 марта 2019

Рассмотрим следующую схему:

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

вопрос и тег имеют отношение многие ко многим.

Я хотел бы выбрать все вопросы, которые имеют определенные теги и не имеют другихтеги.

например, вопрос, который имеет оба идентификатора тега [1,2], но не имеет идентификатора тега [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;

Часть 'include' работает - я получаю только те вопросы, в которых есть оба тега.

Теперь мне нужно добавить часть 'exclude' - например, отфильтровать наши вопросы, которые также имеют tag_id = 3.

Я попытался добавить AND tag_id NOT IN (3) безуспешно - эти вопросы не были отфильтрованы по результатам.

Есть идеи, что мне не хватает?

1 Ответ

1 голос
/ 05 марта 2019

Вы можете попробовать использовать коррелированный подзапрос с несуществующим

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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...