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