2012-07-20 318 views
0

我發現了類似的問題,但最後卻完全不同,沒有人回答我的問題。SQL - 從電影數據庫獲取所有電影及其詳細信息的請求

我使用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) 

我想要顯示的影片列表,併爲每個電影演員和導演(S)

什麼是最有效的方式來獲取?是否有可能在一個具有多個左連接的獨特查詢中?

感謝

+0

聽起來像這可能是功課。你試過什麼了? – Greg 2012-07-20 04:47:40

回答

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 

我有一個類似電影數據庫!我認爲你所定義的'角色'表是不必要的 - 我有一個單獨的'director'表,它直接鏈接到'電影'表:在同一個moview中有兩個導演是非常罕見的, (如科恩兄弟),他們傾向於經常一起工作,所以他們可以被視爲一名導演。

使用左連接而不是內連接允許顯示沒有導演或演員鏈接的電影。

+0

是的,但你也有製片人等......他們都可以是同一個藝術家,同一個人 – cam 2012-07-20 04:50:24

+0

@cam:那又如何?您所建議的模式意味着您需要在'藝術家'桌上多次加入以代表演員,導演和製作人。 – 2012-07-20 04:52:23

+0

好吧,查詢工作得很好,我可以看到我得到的表格,但是如何使用它來正確顯示它?我必須對這個結果做其他查詢? – cam 2012-07-20 04:55:48

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 

等等等等

+0

在這種情況下,我想要所有的電影,問題是要顯示我得到正確的... – cam 2012-07-20 05:03:00

+0

@Cam我已經更新了我對特定表格的回答。 :)這應該符合你的需求。 Regards – Killrawr 2012-07-20 05:18:27

0

LEFT JOINS應該只是罰款。

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 
+0

是的,所以我可以說3部電影,2部是演員,1部是導演。如何有效地撤銷數據以便輕鬆顯示?即foreach電影,回聲電影[編號] [導演]等... – cam 2012-07-20 05:05:49

+0

沉重編輯我的答案,我希望是你的要求。如果它不是100%正確的,我會在早上測試它併發布更新,但它應該指向正確的方向 – Xesued 2012-07-20 05:35:15

相關問題