如何解决这种关系除法查询?

时间:2013-05-29 01:06:00

标签: mysql sql relational-division

我有一个表(movies),其中包含两个外键movie_idgenre_id)。当然,这两个领域都不是唯一的。

所以我的问题如下,我想选择一部有两种或两种以上特定类型的电影。所以我想做类似的事情:

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

关于如何做的任何想法? 谢谢!

2 个答案:

答案 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子句中的每个子句都计算与每种类型匹配的记录数。