0

我有 3 个表:MoviesActorsMovieActors。是和与 列、和MovieActors的多对多关系MoviesActorsMovieActorIdMovieIdActorId

如何找到包含特定演员的电影?例如,我想查找所有同时包含 Michael Fassbender(演员 ID 1)和布拉德皮特(演员 ID 2)的电影。查询会是什么样子?

4

3 回答 3

5

一种方法是加入表格。过滤演员,然后确保计数中包含您想要的演员数量(在这种情况下为 2)

SELECT 
   m.MovieID
FROM
    Movies m
    INNER JOIN MovieActors ma
    ON m.MovieID = ma.MovieID

WHERE
    ma.ActorID IN (1,2)
GROUP BY 
   m.MovieID
HAVING COUNT(DISTINCT ma.ActorID) = 2 

演示

笔记

感谢 user814064 指出,由于演员可以在一部电影中扮演多个角色,我们需要计算的DISTINCT ma.ActorID不仅仅是* SQL Fiddle Demo 演示了差异

于 2013-09-17T21:42:24.540 回答
2
select m.movieid
from movies m
inner join movieactors ma on ma.movieid = m.movieid
where ma.actorid in (1,2)
group by m.movieid
having count(distinct ma.actorid) = 2
于 2013-09-17T21:42:36.977 回答
1

为简单起见,您只需执行两个in子句:

select * from Movies m
where m.MovieId in (select MovieId from MovieActors where ActorId = 1)
and m.MovieId in (select MovieId from MovieActors where ActorId = 2)

性能可能不如 single join,但它干净且易于阅读。

于 2013-09-17T21:44:42.143 回答