2010-11-11 89 views
0

我有一些问题,我无法解决的sql查询。改进sql查询选择玩游戏的数量和玩家赢得的游戏数量

我有2个表:

players: id, name 
games: id, name, player1_id, player2_id, winner_id 

现在我想要得到的游戏总量,赢得了每一个玩家。

目前我与子选择这样做:

SELECT player.name AS name, 
(SELECT COUNT(id) FROM replays AS replay WHERE replay.player1_id = player.id OR replay.player2_id = player.id) AS games, 
(SELECT COUNT(id) FROM replays AS replay WHERE replay.winner_id = player.id) AS wins 
FROM players AS player 

但首先它是非常缓慢的。 而且,我无法进行复杂的搜索查询,例如搜索赢得超过次数的游戏或者游戏次数少的游戏。

你有什么想法,我该如何改进这个查询?

预先感谢您。

回答

1

尝试这样:

select a.player_id, p.name, count(*) as GamesCount, 
    count(case when g.winner_id = a.player_id then 1 end) as WinsCount 
from (
    select player1_id as player_id 
    from games 
    union 
    select player2_id as player_id 
    from games 
) a 
inner join games g on a.player_id = g.player1_id 
    or a.player_id = g.player2_id 
inner join players p on a.player_id = p.id 
group by a.player_id, p.name 
+0

非常感谢您的回答。 – MoVSic 2010-11-15 09:26:14

+0

但是,如果我想添加搜索值,例如我想选择所有拥有10胜以上的玩家? – MoVSic 2010-11-15 09:27:22

+0

要添加搜索值,您需要HAVING子句:http://dev.mysql.com/doc/refman/5.0/en/select.html – 2010-12-18 11:22:10