Как я могу упростить этот игровой статистический запрос?

Этот код работает, как и ожидалось, но он длинный и жуткий.

select p.name, p.played, w.won, l.lost from

(select users.name, count(games.name) as played
from users
inner join games on games.player_1_id = users.id
where games.winner_id > 0
group by users.name
union
select users.name, count(games.name) as played
from users
inner join games on games.player_2_id = users.id
where games.winner_id > 0
group by users.name) as p

inner join

(select users.name, count(games.name) as won
from users
inner join games on games.player_1_id = users.id
where games.winner_id = users.id
group by users.name
union
select users.name, count(games.name) as won
from users
inner join games on games.player_2_id = users.id
where games.winner_id = users.id
group by users.name) as w on p.name = w.name

inner join

(select users.name, count(games.name) as lost
from users
inner join games on games.player_1_id = users.id
where games.winner_id != users.id
group by users.name
union
select users.name, count(games.name) as lost
from users
inner join games on games.player_2_id = users.id
where games.winner_id != users.id
group by users.name) as l on l.name = p.name

Как видите, он состоит из 3 повторяющихся частей для извлечения:

имя игрока и количество игр, в которые они игралиимя игрока и количество игр, которые они выигралиимя игрока и количество проигранных игр

И каждый из них также состоит из 2 частей:

имя игрока и количество игр, в которых они участвовали как player_1имя игрока и количество игр, в которых они участвовали как player_2

Как это можно упростить?

Результат выглядит так:

           name            | played | won | lost 
---------------------------+--------+-----+------
 player_a                  |      5 |   2 |    3
 player_b                  |      3 |   2 |    1
 player_c                  |      2 |   1 |    1

Ответы на вопрос(3)

Ваш ответ на вопрос