2010-04-15 169 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