Pour calculer les victoires et les pertes de chaque utilisateur sans avoir à rejoindre le tableau à lui-même et à utiliser des jointures externes, il est possible de sélectionner des victoires et des pertes séparément et de faire une union entre elles, mais avec des informations supplémentaires si la ligne donne une victoire pour l'utilisateur, ou une perte.
Ensuite, il est facile de calculer toutes les victoires et pertes pour chaque utilisateur. La partie délicate consistait à incorporer l'option pour spécifier à quel utilisateur vous souhaitez comparer les profils. Je l'ai fait avec une variable qui est définie sur la valeur de percentage
de l'utilisateur avec donné user_id
, que vous pouvez passer d'une constante à une variable.
Voici ma proposition (par rapport à l'utilisateur avec 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
;
Production:
ID_USER WINS LOSSES TOTAL PERCENT 6 8 2 10 0.8 9 6 1 7 0.8571
Vous pouvez bien sûr supprimer l'utilisateur dont le profil est la base de comparaison en ajoutant player_id != 6
(ou, dans la solution finale, un nom de variable) WHERE
clause.
Exemple à Sqlfiddle: Profils correspondants - Exemple
Pourriez-vous fournir des commentaires si c'est ce que vous recherchiez et, sinon, quelle sortie vous attendriez-vous?