This code works as expected, but I it\'s long and creepy.
select p.name, p.played, w.won, l.lost from
(select users.name, count(games.name) as played
from u
select users.name,
count(case when games.winner_id > 0
then games.name
else null end) as played,
count(case when games.winner_id = users.id
then games.name
else null end) as won,
count(case when games.winner_id != users.id
then games.name
else null end) as lost
from users inner join games
on games.player_1_id = users.id or games.player_2_id = users.id
group by users.name;