我有一个表(movies
),其中包含两个外键(movie_id
,genre_id
)。当然,这两个领域都不是唯一的。
所以我的问题如下,我想选择一部有两种或两种以上特定类型的电影。所以我想做类似的事情:
SELECT movie_id
FROM movies
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3
关于如何做的任何想法? 谢谢!
答案 0 :(得分: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
个关键字来过滤唯一的关键字。
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
答案 1 :(得分:2)
这是“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
子句中的每个子句都计算与每种类型匹配的记录数。