我有3张桌子:Movies
,Actors
和MovieActors
。 MovieActors
是Movies
和Actors
与MovieActorId
,MovieId
和ActorId
如何查找包含特定演员集的电影?例如,我想找到所有同时拥有Michael Fassbender(演员Id 1)和Brad Pitt(演员Id 2)的电影。查询会是什么样的?
答案 0 :(得分: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小提琴演示演示差异
答案 1 :(得分: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
答案 2 :(得分: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)
性能可能不如单join
那么好,但它干净且易于阅读。