यहां एक वैकल्पिक समाधान है:रैंक को बिल्कुल भी स्टोर न करें! :-)
आप तुरंत उनकी गणना कर सकते हैं।
उदाहरण:
SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr,
(@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC;
परिणाम:
+------+----+-------+------+
| id | nr | score | rank |
+------+----+-------+------+
| 2 | 1 | 23 | 1 |
| 4 | 1 | 17 | 2 |
| 1 | 0 | 17 | 2 |
| 5 | 1 | 10 | 3 |
| 3 | 1 | 2 | 4 |
+------+----+-------+------+
nr
यहाँ एक सहायक कॉलम है जो इंगित करता है कि हमें अगली रैंक प्रदान करनी चाहिए या नहीं।
आप इस क्वेरी को दूसरे select
. में लपेट सकते हैं और उदाहरण के लिए पेजिंग करें।
SELECT id, score, rank
FROM (SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr,
(@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC) t
WHERE rank > 1 and rank < 3;
परिणाम:
+------+-------+------+
| id | score | rank |
+------+-------+------+
| 4 | 17 | 2 |
| 1 | 17 | 2 |
+------+-------+------+
सावधानी :अब से rank
एक परिकलित स्तंभ है, आप इसे अनुक्रमित नहीं कर सकते हैं और कुशलतापूर्वक पृष्ठ को डेटासेट में दूर कर सकते हैं (अर्थात, "3000 से 3010 तक के रैंक वाले रिकॉर्ड का चयन करें")। लेकिन यह अभी भी "चुनिंदा शीर्ष एन रैंक" के लिए अच्छा है (बशर्ते कि आप संबंधित LIMIT
एक प्रश्न पर)