Hier is een alternatieve oplossing:sla helemaal geen rangen op! :-)
Je kunt ze in een oogwenk berekenen.
Voorbeeld:
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;
Resultaat:
+------+----+-------+------+
| 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
hier is een hulpkolom die aangeeft of we de volgende rang moeten toewijzen of niet.
U kunt deze zoekopdracht in een andere select
plaatsen en bijvoorbeeld paging uitvoeren.
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;
Resultaat:
+------+-------+------+
| id | score | rank |
+------+-------+------+
| 4 | 17 | 2 |
| 1 | 17 | 2 |
+------+-------+------+
VOORZICHTIG :sinds nu rank
een berekende kolom is, kunt u deze niet indexeren en efficiënt ver in de dataset bladeren (dat wil zeggen, "selecteer records met een rangorde van 3000 tot 3010"). Maar het is nog steeds goed voor "selecteer top N-rangen" (op voorwaarde dat u een overeenkomstige LIMIT
plaatst op een vraag)