2013-05-29 4 views
2

У меня есть стол (movies) с двумя внешними ключами (movie_id, genre_id). Конечно, оба поля не уникальны.Как решить этот запрос реляционного деления?

Итак, мой вопрос следующий: Я хочу выбрать фильм, имеющий два или более конкретных жанра. Так что я хочу сделать что-то вроде:

SELECT movie_id 
FROM movies 
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3 

Любые идеи о том, как это сделать? Спасибо!

ответ

6

Это проблема Relational Division.

SELECT movie_id 
FROM movies 
WHERE genre_id IN (1, 2, 3) -- <<== list of genre_id 
GROUP BY movie_id 
HAVING COUNT(*) = 3   -- <<== count of genre_id 

Если genre_id не является уникальным для каждого movie_id, DISTINCT ключевое слово необходимо для фильтрации уникальных.

+0

Очень благодарен мужчинам, он отлично работал. Я не думал, как его решить. – Fosfor

+0

приветствую ':)' кстати, какие RDBMS вы используете? –

+0

Собственно, используя MySQL – Fosfor

2

Это пример запроса «set-in-sets». Я думаю, что наиболее общий способ поставить все условия в предложении having:

SELECT movie_id 
FROM movies 
group by movie_id 
having sum(case when genre_id = 1 then 1 else 0 end) > 0 and 
     sum(case when genre_id = 2 then 1 else 0 end) > 0 and 
     sum(case when genre_id = 3 then 1 else 0 end) > 0; 

Каждый из пунктов в пункте having рассчитывает количество записей, которые соответствуют каждому типу жанра.