2010-04-15 170 views
1

我很慚愧地說,我的SQL體驗很少使用,當我必須構造一個稍微複雜的查詢時它會崩潰,所以我會欣賞SQL專家意見。SQL - 多個連接到一個表 - 兩個鍵的兩個值

基本上我有兩個表,類似於以下

games(game_id, game_date, player_a_id, player_a_score, player_b_id, player_b_score) 
players(player_id, player_name) 

我希望構造,在相同的結果集返回查詢,球員的名字和分數IE瀏覽器。

game_id,GAME_DATE,player_a_name,player_a_score,player_b_name,player_b_score

這裏是我的,我想幼稚的方法來優化

select games.game_id, games.game_date, (select player_name from players where player_id = games.player_a_id), games.player_a_score, (select player_name from players where player_id = games.player_b_id), games.player_b_score) 

誰能告訴我接近這一目標的最佳方式是什麼?

謝謝!

回答

2

也許是這樣的:

select 
    games.game_id, 
    games.game_date, 
    pa.player_name as 'player_a_name', 
    games.player_a_score, 
    pb.player_name as 'player_b_name', 
    games.player_b_score 
from games 
inner join players pa on (games.player_a_id = pa.player_id) 
inner join players pb on (games.player_b_id = pb.player_id) 
+0

你能解釋一下爲什麼內部連接將更有效率比左加入? – adam 2010-04-22 13:27:00

+0

當player_a_id爲null或player_b_id爲null時,情況如何?本聲明不選擇這些遊戲。 – mphair 2010-07-06 20:44:57

+1

我想我假設player_a_id和player_b_id不能爲null。如果其中一個爲空,那麼你爲什麼會得到一個帶有分數的遊戲記錄? – 2010-07-07 01:32:22

2
SELECT 
    g.game_id, g.game_date, 
    pa.player_name, g.player_a_score, 
    pb.player_name, g.player_b_score 
FROM games g 
LEFT JOIN player pa ON (pa.player_id=g.player_a_id) 
LEFT JOIN player pb ON (pb.player_id=g.player_b_id) 
+0

你能解釋一下爲什麼左連接會比內連接更有效率嗎? – adam 2010-05-26 15:50:27

+0

使用「EXPLAIN」向MySQL詢問它計劃在每種情況下做什麼。我不認爲有一個簡單的答案。 我通常使用LEFT JOIN,因爲它更容易(對我)可視化我要求的內容。 這裏有一些相關的鏈接(具有完全不同的結果): 1. http://stackoverflow.com/questions/186071/left-join-outperforming-inner-join 2. HTTP://forums.mysql .COM/read.php?24,205080 – dkamins 2010-05-28 02:06:15