我有一个movies
带有两个外键 ( movie_id
, ) 的表 ( genre_id
)。当然,这两个领域都不是唯一的。
如何选择具有两种或多种特定类型的电影?
我想做类似的事情:
SELECT movie_id
FROM movies
WHERE genre_id = 1 AND genre_id = 2 AND genre_id = 3
我有一个movies
带有两个外键 ( movie_id
, ) 的表 ( genre_id
)。当然,这两个领域都不是唯一的。
如何选择具有两种或多种特定类型的电影?
我想做类似的事情:
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
都在计算与每种类型匹配的记录数。