我遇到了一些我无法解决的SQL查询问题。
我有两张桌子:
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
但首先它非常缓慢。 而且我无法进行复杂的搜索查询,例如搜索胜利超过smth或游戏少的玩家。
您有什么想法如何改进此查询?
提前谢谢。
答案 0 :(得分: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