我有 3 个表:Movies
、Actors
和MovieActors
。是和与 列、和MovieActors
的多对多关系Movies
Actors
MovieActorId
MovieId
ActorId
如何找到包含特定演员的电影?例如,我想查找所有同时包含 Michael Fassbender(演员 ID 1)和布拉德皮特(演员 ID 2)的电影。查询会是什么样子?
我有 3 个表:Movies
、Actors
和MovieActors
。是和与 列、和MovieActors
的多对多关系Movies
Actors
MovieActorId
MovieId
ActorId
如何找到包含特定演员的电影?例如,我想查找所有同时包含 Michael Fassbender(演员 ID 1)和布拉德皮特(演员 ID 2)的电影。查询会是什么样子?
一种方法是加入表格。过滤演员,然后确保计数中包含您想要的演员数量(在这种情况下为 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 演示了差异
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
为简单起见,您只需执行两个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
,但它干净且易于阅读。