Oggi mi sono imbattuto nella seguente attività mentre lavoravo a un progetto di un cliente: prendere una tabella SQL "utente" con le colonne "id" e "punteggio" e determinare una classifica di tutti gli utenti ordinati per "punteggio" in cui gli utenti con il ottenere la stessa classifica con lo stesso punteggio. Questa attività può essere risolta in modo intuitivo e semplice utilizzando variabili definite dall'utente .
CREATE TABLE user(id INT, score INT); INSERT INTO user(id, score) VALUES (1, 10), (2, 40), (3, 55), (4, 10), (5, 5), (6, 20), (7, 30), (8, 70), (9, 30)
L'uso di due variabili risolve questo problema semplicemente
SET @score_prev = NULL; SET @cur_rank = 0; SELECT id, score, CASE WHEN @score_prev = score THEN @cur_rank WHEN @score_prev := score THEN @cur_rank := @cur_rank + 1 END AS rank FROM user ORDER BY score DESC
e ottieni l'output che desideri
+--------+-----------+----------+ | *id* | *score* | *rank* | | 8 | 70 | 1 | | 3 | 55 | 2 | | 2 | 40 | 3 | | 7 | 30 | 4 | | 9 | 30 | 4 | | 6 | 20 | 5 | | 1 | 10 | 6 | | 4 | 10 | 6 | | 5 | 5 | 7 | +--------+-----------+----------+