【问题标题】:how to query many-to-many?如何查询多对多?
【发布时间】:2010-10-24 08:56:26
【问题描述】:

我在看 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 查询字符串。

谢谢!

【问题讨论】:

  • 您可能希望将您的代码示例放在一个代码块中 - 只需在每行之前放置四个空格,并在代码块之前和之后放置一个空行。

标签: mysql many-to-many


【解决方案1】:

可能是这样的:

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'

【讨论】:

  • 有没有办法只获得像 IN ('Christopher Walken', 'John Doe') @AndyWhite 这样的演员组合的电影
  • @mcek 你可以使用这样的子查询来做到这一点:pasted code。另一种方式是“自加入”:pasted code。但在这两种情况下,查询都会随着参与者数量的增加而增长。所以它们不是通用的,但可以自动生成。
【解决方案2】:

要考虑的一件事是您将加载作者对象(因为 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 鉴于 StackExchange 的性质,“下一个答案”是未定义的。你说谁的答案?
  • @Frungi 可能是投票最多的人~作者安迪·怀特。
【解决方案3】:

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

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 - 当然,只需在 WHERE 子句中使用 OR
【解决方案4】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2011-08-21
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2019-12-23
    • 2016-12-15
    相关资源
    最近更新 更多