Per calcolare le vittorie e le perdite di ciascun utente senza dover unirsi al tavolo a se stesso e utilizzare i join esterni, è possibile selezionare solo vittorie e perdite separatamente e fare un sindacato tra loro, ma con ulteriori informazioni se la riga fornita rappresenta una vittoria per l'utente o una perdita.
Quindi, è facile calcolare tutte le vittorie e le perdite per ciascun utente. La parte difficile era incorporare l'opzione per specificare quale utente si desidera confrontare i profili. L'ho fatto con una variabile che è impostata sul valore di percentage
dell'utente con dato user_id
, che puoi cambiare da una costante a una variabile.
Ecco la mia proposta (rispetto all'utente 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
;
Produzione:
ID_USER WINS LOSSES TOTAL PERCENT 6 8 2 10 0.8 9 6 1 7 0.8571
Ovviamente è possibile rimuovere l'utente il cui profilo è la base per il confronto aggiungendo player_id != 6
(o, nella soluzione finale, qualche nome variabile) alla condizione più esterna WHERE
clausola.
Esempio su sqlfiddle: Profili di corrispondenza - Esempio
Potresti fornire un feedback se questo è quello che stavi cercando e, in caso contrario, quale output ti aspetteresti?