如何查询多对多关系?

40

我在观看 Ruby on Rails 教程时发现了以下表结构。

table actors
id  int  11  primary key auto_increment
name  varchar  30

table movies
id  int  11  primary key auto_increment
name  varchar  30

table actors_movies
actor_id  int  11
movie_id  int  11

如何查询出一位演员参演的电影?我不是要 Ruby on Rails 代码,而是实际的 MySQL 查询语句。谢谢!


你可能想把你的代码示例放在一个代码块中 - 只需在每行代码前面放四个空格,并在块之前和之后放一个空行。 - bdonlan
4个回答

54

也许可以尝试这样:

select m.name
from movies m
inner join actors_movies am on m.id = am.movie_id
inner join actors a on am.actor_id = a.id
where a.name = 'Christopher Walken'

有没有办法只获取演员组合为('Christopher Walken', 'John Doe')的电影?@AndyWhite - mcek
1
@mcek,你可以使用子查询来完成,像这样:粘贴的代码。 另一种方法是“自连接”:粘贴的代码。 但在这两种情况下,查询将随着组合中演员数量的增加而增长。因此它们不是通用的,但可以自动生成。 - chill appreciator

21

需要考虑的一件事是,由于RoR模型的原因,您将加载作者对象,所以只使用ID即可:

select movies.id, movies.name
from movies inner join actors_movies
on actors_movies.movie_id=movies.id
where actors_movies.actor_id=$actor_id

它是不完整的,最好的是下一个答案。 - Christiano Matos
2
@Christiano 鉴于 StackExchange 的性质,“下一个答案” 是未定义的。你指的是谁的答案? - Frungi
@Frungi 可能是最受欢迎的一个 ~ Andy White. - Pathros

10

简单,只需使用组合表连接电影/演员表:

Select m.name 
From actors a
Inner Join actors_movies am On am.actor_id = a.id
Inner Join movies m On m.id = am.movie_id
Where a.name = @your_actor

有没有办法只获取演员组合为 IN ('Christopher Walken', 'John Doe') 的电影?@JustinEthier - mcek
@mcek - 当然,只需在WHERE子句中使用OR即可。 - Justin Ethier

2
select m.* from movies m 
inner join actors_movies am on am.movie_id  = m.id 
inner join actors a on a.id = am.actor_id 
where a.someField = somevalue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接