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 | +--------+-----------+----------+