2011-01-26 51 views
0

我很难提出一个查询,返回玩家的id,name以及玩家的第一个匹配date,matchidopponent从3个表查询具体数据

我想要获得与玩家最后一场比赛相同的信息。

`players` 
id | name 

    1 | playername10 
    2 | playername22 
    3 | playername33 
    4 | playername45 
    5 | playername55 

`matches` 
    id | gamedate | opponent 

1 | 2011-01-01 | opponent1 
2 | 2011-01-02 | opponent2 
3 | 2011-01-03 | opponent3 
4 | 2011-01-04 | opponent4 
5 | 2011-01-05 | opponent5 


`playermatchscores` 
id | matchid |  player | goals 

1 | 1  | playername10 | 1 
2 | 1  | playername22 | 2 
3 | 2  | playername10 | 1 
4 | 1  | playername33 | 1 
5 | 3  | playername45 | 2 
6 | 4  | playername55 | 1 
7 | 2  | playername55 | 1 
8 | 3  | playername22 | 2 
9 | 5  | playername55 | 1 

matchid是表matches一个外键id

我尝试了几个查询,但我可能以错误的方式接近它。我怎样才能写出一种方式来获取我想要的信息?

回答

0

约LEFT JOIN的信息:http://www.w3schools.com/sql/sql_join_left.asp

 

SELECT players.id, MAX(matches.gamedate) AS first_match, MIN(matches.gamedate) AS last_match 
FROM playermatchscores 
LEFT JOIN players ON players.player = playermatchscores.player 
LEFT JOIN matches ON matches.id = playermatchscores.matchid 
GROUP BY players.player 
 

我没有测试过这个选择。

P.S.在playermatchscores中,您应该使用player_id的玩家表的外键。

有问题的变化后:

 

SELECT players.*, matches.*, 
FROM playermatchscores 
LEFT JOIN players ON players.name = playermatchscores.player 
LEFT JOIN matches ON matches.id = playermatchscores.matchid 
ORDER BY matches.gamedate ASC 
WHERE players.id = 3 
LIMIT 1 
 

对于最后一场比赛中与DESC替换ASC。

P.S.这不是最好的方式,但它应该工作。

+0

我编辑了这个问题,因为我应该在两个查询中做。请参阅我的编辑。我也通过玩家ID查找玩家。所以我会在查询中的某处使用WHERE players.id = 3`。 – Tek 2011-01-26 23:12:46