movies
2 つの外部キー ( movie_id
、 )を持つテーブル ( ) がありますgenre_id
。もちろん、両方のフィールドが一意ではありません。
特定のジャンルが 2 つ以上ある映画を選択するにはどうすればよいですか?
私は次のようなことをしたい:
SELECT movie_id
FROM movies
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3
movies
2 つの外部キー ( movie_id
、 )を持つテーブル ( ) がありますgenre_id
。もちろん、両方のフィールドが一意ではありません。
特定のジャンルが 2 つ以上ある映画を選択するにはどうすればよいですか?
私は次のようなことをしたい:
SELECT movie_id
FROM movies
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3
これは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
一意のものをフィルタリングするためにキーワードが必要です。
SELECT movie_id
FROM movies
WHERE genre_id IN (1, 2, 3) -- <<== list of genre_id
GROUP BY movie_id
HAVING COUNT(DISTINCT genre_id) = 3 -- <<== count of genre_id
これは、「set-within-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
句は、各タイプのジャンルに一致するレコードの数をカウントしています。