ஒரு வாடிக்கையாளர் திட்டத்தில் பணிபுரியும் போது இன்று நான் பின்வரும் பணியைக் கண்டேன்: "ஐடி" மற்றும் "ஸ்கோர்" நெடுவரிசைகளுடன் ஒரு SQL அட்டவணை "பயனர்" ஐ எடுத்து, "மதிப்பெண்" அடிப்படையில் அனைத்து பயனர்களின் தரவரிசையை தீர்மானிக்கவும். அதே மதிப்பெண்ணுடன் அதே தரவரிசையைப் பெறுங்கள். பயனர் வரையறுக்கப்பட்ட மாறிகளைப் பயன்படுத்துவதன் மூலம் இந்த பணியை உள்ளுணர்வாகவும் எளிதாகவும் தீர்க்க முடியும்.
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)
இரண்டு மாறிகள் பயன்படுத்துவது இதை வெறுமனே தீர்க்கிறது
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
நீங்கள் விரும்பும் வெளியீட்டைப் பெறுவீர்கள்
+--------+-----------+----------+ | *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 | +--------+-----------+----------+