Фильтр таблицы по другой таблице

Рейтинг: -1Ответов: 1Опубликовано: 01.03.2015

Добрый день. Есть две таблицы. Titles и Genres

Titles:

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+

Genres:

+----+------------+------------+
| id |  title_id  |  genre_id  |
+----+------------+------------+
|  1 |     1      |     1      |
|  2 |     1      |     2      |
|  3 |     2      |     1      |
|  4 |     2      |     3      |
|  5 |     3      |     4      |
|  6 |     3      |     2      |
|  7 |     4      |     5      |
|  7 |     4      |     6      |
+----+------------+------------+

Согласно им title с номером 2 соответствуют два genre (1 и 3)

Мне необходимо вывести список titles у которых, например, genre одновременно равен 1 и 3 ИЛИ одновременно не равен 2 и 4

Пробую такой запрос: работает для условия IN. Можно ли написать подобный для NOT IN, чтобы запрос особо не менялся и мог выполниться при условии, что часть IN тоже присутствует. Возможно ли построить такой запрос?

SELECT t.id FROM titles t 
LEFT JOIN genres g ON t.id = g.title_id 
WHERE g.genre_id IN(1, 2) 
GROUP BY t.id 
HAVING count(DISTINCT g.genre_id) = 2 
ORDER BY t.id

Ответы

▲ 1

Не совсем понятно, на какой результат ты рассчитываешь в результате выполнения твоей логики:

  1. для единицы это будет (да или нет)и(не(нет или нет)) = да
  2. для двойки (нет или да)и(не(да или нет)) = нет
  3. для тройки (нет или нет)и(не(нет или нет)) = нет
  4. для четверки (нет или нет)и(не(нет или да)) = нет

То есть фактически g.genre_id IN(1, 2) AND g.genre_id NOT IN(2, 4) ты выбираешь строки, где genre_id=1.

Обновление

Ты копаешь не в ту сторону. Твой запрос не может просмотреть несколько строк таблицы, он всегда будет смотреть только на одну (в которой, естественно, genre_id не может одновременно равняться 2 и не равняться 2). Чтобы искать совпадение двух жанров, надо умножить таблицу на саму себя

По твоей обновленной логике, получается, что ответом на запрос является сложение множества (1,2) и (2), что равняется (1,2).

(1,2) так как это те тайтлы, в которых не встречается 2 и 4 одновременно. (2) так как это тот тайтл, в котором встречается 1 и 3 одновременно.

Такие данные, по твоему разумению, должны были получиться в результате выполнения запроса?