Truy vấn SQL để xác định danh sách xếp hạng

Hôm nay, tôi đã gặp nhiệm vụ sau khi làm việc trong một dự án khách hàng: Lấy một "người dùng" trong bảng SQL với các cột "id" và "score" và xác định danh sách xếp hạng của tất cả người dùng, được sắp xếp dựa trên "điểm", trong đó những người dùng có cùng số điểm sẽ có cùng thứ hạng. Bằng cách sử dụng các biến do người dùng xác định, nhiệm vụ này có thể được giải quyết một cách trực quan và dễ dàng.


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)

Sử dụng hai biến giải quyết điều này một cách đơn giản:

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

và bạn nhận được đầu ra bạn muốn:

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Trở lại