Рассмотрим следующую схему:
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)
безуспешно - эти вопросы не были отфильтрованы по результатам.
Есть идеи, что мне не хватает?