Para calcular vitórias e perdas de cada usuário sem precisar se juntar à tabela para si mesmo e usar junções externas, é possível selecionar vitórias e perdas separadamente e fazer uma união tudo entre eles, mas com informações adicionais se dado a linha representar uma vitória para uma vitória para o usuário, ou uma perda.
Em seguida, é fácil calcular todas as vitórias e perdas para cada usuário. A parte complicada era incorporar a opção para especificar a qual usuário você gostaria de comparar os perfis. Eu fiz isso com uma variável que é definida para o valor de percentage
do usuário com dado user_id
, que você pode mudar de uma variável constante para uma variável.
Aqui está minha proposta (comparando com o usuário com id = 6):
SELECT
player_id AS id_user,
wins,
losses,
wins + losses AS total,
wins / (wins + losses) AS percent
FROM (
SELECT
player_id,
SUM(is_a_win) wins,
SUM(is_a_loss) losses,
CASE
WHEN player_id = 6
THEN @the_user_score := SUM(is_a_win) / (SUM(is_a_win) + SUM(is_a_loss))
ELSE NULL
END
FROM (
SELECT id_user_winner AS player_id, 1 AS is_a_win, 0 AS is_a_loss FROM user_versus
UNION ALL SELECT id_user_loser, 0, 1 FROM user_versus
) games
GROUP BY player_id
) data
WHERE
ABS(wins / (wins + losses) - @the_user_score) <= 0.1
;
Resultado:
ID_USER WINS LOSSES TOTAL PERCENT 6 8 2 10 0.8 9 6 1 7 0.8571
É claro que você pode remover o usuário cujo perfil é a base para comparação, adicionando player_id != 6
(ou, na solução final, algum nome de variável) Condição para o mais externo WHERE
cláusula.
Exemplo no SQLFIDLE: Perfis correspondentes - exemplo
Você poderia fornecer algum feedback se era isso que você estava procurando e, se não, que saída você esperaria?