Hari ini saya menemui tugas berikut semasa mengerjakan projek pelanggan: Ambil "pengguna" jadual SQL dengan lajur "id" dan "skor" dan tentukan kedudukan semua pengguna berdasarkan "skor" di mana pengguna dengan mendapat kedudukan yang sama dengan skor yang sama. Tugas ini dapat diselesaikan secara intuitif dan mudah dengan menggunakan pemboleh ubah yang ditentukan pengguna .
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)
Menggunakan dua pemboleh ubah menyelesaikannya secara sederhana
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
dan anda mendapat output yang anda mahukan
+--------+-----------+----------+ | *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 | +--------+-----------+----------+