2010-11-11 82 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