2015-05-24 87 views
1

我是新来的SQL,并试图获得连接和引用的句柄。SQL:如何从同一个表中选择两个ID作为两个名称?

数据库是这样的:

玩家

id | name 
----+------- 
    1 | john 
    2 | tim 
    3 | frank 
    4 | tony 
    5 | mark 

匹配

id | winner | loser 
----+--------+------- 
    1 |  2 |  4 
    2 |  3 |  4 
    3 |  4 |  5 
    4 |  1 |  4 

我想要得到这样的结果:

id | winner | loser 
----+--------+------- 
    1 | tim | tony 
    2 | frank | tony 
    3 | tony | mark 
    4 | john | tony 

到目前为止,我可以这样做:

select matches.id, players.name as winner, players.name as loser 
    from matches, players 
    where winner = players.id; 

但是,如果我添加and loser = players.id,它不返回行。

我也试过这样:

select matches.id, players.name as winner, players.name as loser 
    from matches 
    join players on matches.winner = players.id 
    join players on matches.loser = players.id; 

产生ERROR: table name "players" specified more than once

我把这个搜索了一个小时,可以找到很多的案例,几乎得到我想要的,但我仍然无法弄清楚如何用同一个表中的两个名称替换两个ID。

回答

3

你几乎有:

select matches.id, w.name as winner, l.name as loser 
from matches 
join players w on matches.winner = w.id 
join players l on matches.loser = l.id; 
+0

谢谢,它的工作原理。我不知道可以在变量'w'和'l'之后放置'players'的特性。有没有一个名称,所以我可以查看它并了解更多信息? – sebu

+1

它被称为别名,用于区分表格并缩短您的语句。 – Tim3880

2

您需要别名表的名称,以便您可以指定加入的数据应该来自。

select 
    matches.id, 
    p1.name as winner, 
    p2.name as loser 
from matches 
    join players p1 on matches.winner = p1.id 
    join players p2 on matches.loser = p2.id; 
+0

谢谢,这个作品 - 我给Tim3880打勾,因为他们的答案基本上和早1分钟相同:)谢谢你的时间。 – sebu

0

您将希望确保您在该表上连接两次并保持别名正确。

SELECT Matches.id, winner.name, loser.name 
From Matches 
INNER JOIN Players as winner on winner.id = Matches.winner 
INNER JOIN Players as loser on loser.id = Matches.winner;