0

我发现了类似的问题,但最后却大不相同,没有一个回答我的问题。

我使用 mySQL

我有一个表 movie_artist_role 喜欢 3 个表电影、艺术家和角色,其中包含 3 个键

mo_id
ar_id
ro_id.

表电影包含

mo_id
mo_title

表艺术家包含

ar_id
ar_name

表角色包含

ro_id
ro_name (actor or producer for instance)

我想显示电影列表,以及每部电影的演员和导演

获得它的最有效方法是什么?是否有可能在一个具有多个左连接的唯一查询中?

谢谢

4

3 回答 3

0

左连接应该可以正常工作。

SELECT m.mo_title AS movie_title, 
       (SELECT group_concat(aIn.ar_name)
        FROM movie_artist_role AS marIn
            LEFT JOIN role AS rIn ON rIn.ro_id = marIn.ro_id
            LEFT JOIN artist AS aIn ON aIn.ar_id = marIn.ao_id
        WHERE rIn.ro_name = 'producer'
            AND marIn.mo_id = m.id ) AS producers,

       (SELECT group_concat(aIn.ar_name)
        FROM movie_artist_role AS marIn
            LEFT JOIN role AS rIn ON rIn.ro_id = marIn.ro_id
            LEFT JOIN artist AS aIn ON aIn.ar_id = marIn.ao_id
        WHERE rIn.ro_name = 'actor'
            AND marIn.mo_id = m.id ) AS actors
FROM movie AS m

这是未经测试的,但应该返回如下行:

movie_title       |      producers       |     actors
-----------------------------------------------------------
Star Treck          JJ Abrams               Chris Pine, Simon Pegg, Zachery
于 2012-07-20T04:49:40.183 回答
0
select movie.mo_title, artist.ar_name, role.ro_name
from movie_artist_role 
left join movie on movie.mo_id = movie_artist_role.mo_id
left join artist on artist.ar_id = movie_artist_role.ar_id
left join role on role.ro_id = movie_artist_role.ro_id
order by movie.mo_tile, artist.ar_name

我有一个类似的电影数据库!我认为你定义的“角色”表是不必要的——我有一个单独的“导演”表,它直接链接到“电影”表:同一部电影很少有两个导演,当有(如科恩兄弟),他们往往经常一起工作,所以他们可以算是一个导演。

使用左连接而不是内连接可以显示没有导演或演员链接的电影。

于 2012-07-20T04:48:43.030 回答
0

连接之间的多个inner join(将从所有 3 个表中提取所有内容)foreign keys将显示每个电影、演员和导演的信息列表。

SELECT * FROM movie_artist_role mar
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

使用WHERE从句可以为您提供有关该电影或演员的详细信息。例如..

SELECT * FROM movie_artist_role mar
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
WHERE a.ar_name = 'Jack Black' ORDER BY m.mo_title, r.role_name

如果您只想要特定表中的特定数据,film那么说......它几乎是上面所做的,但相反。

SELECT * FROM movie m
INNER JOIN movie_artist_role mar ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

artists...

SELECT * FROM artists a
INNER JOIN movie_artist_role mar ON mar.ar_id = a.ar_id
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

等等等等

于 2012-07-20T04:49:09.763 回答