2

我有一个movies带有两个外键 ( movie_id, ) 的表 ( genre_id)。当然,这两个领域都不是唯一的。

如何选择具有两种或多种特定类型的电影?

我想做类似的事情:

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

2 回答 2

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
于 2013-05-29T01:07:07.090 回答
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都在计算与每种类型匹配的记录数。

于 2013-05-29T01:09:51.867 回答