Hari ini saya menemui tugas berikut semasa mengerjakan projek pelanggan: Ambil jadual SQL "pengguna" dengan lajur "id" dan "skor" dan tentukan senarai kedudukan semua pengguna, diisih berdasarkan "skor", di mana pengguna dengan skor yang sama mendapat kedudukan yang sama. Dengan menggunakan pembolehubah yang ditentukan pengguna, tugas ini boleh diselesaikan secara intuitif dan mudah.
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 | +--------+-----------+----------+