Para calcular las victorias y pérdidas de cada usuario sin tener que unirse a la tabla a sí misma y usar uniones externas, es posible seleccionar victorias y pérdidas por separado y hacer una unión entre ellos, pero con información adicional si se le da una fila representa una victoria para el usuario o una pérdida.
Luego, es fácil calcular todas las victorias y pérdidas para cada usuario. La parte difícil fue incorporar la opción para especificar a qué usuario le gustaría comparar los perfiles. Lo hice con una variable que se establece en el valor de percentage
del usuario con dado user_id
, que puede cambiar de una constante a una variable.
Aquí está mi propuesta (en comparación con el usuario con 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
;
Producción:
ID_USER WINS LOSSES TOTAL PERCENT 6 8 2 10 0.8 9 6 1 7 0.8571
Por supuesto, podría eliminar al usuario cuyo perfil es la base para la comparación agregando player_id != 6
(o, en la solución final, algún nombre de variable) con el más externo WHERE
cláusula.
Ejemplo en SQLFIDDLE: Perfiles coincidentes - Ejemplo
¿Podría proporcionar algunos comentarios si esto es lo que estaba buscando y, si no, qué salida esperaría?