Hier ist eine alternative Lösung:Ränge überhaupt nicht speichern! :-)
Sie können sie spontan berechnen.
Beispiel:
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;
Ergebnis:
+------+----+-------+------+
| 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 ist eine Hilfsspalte, die angibt, ob wir den nächsten Rang zuweisen sollen oder nicht.
Sie können diese Abfrage in ein weiteres select
einschließen und zum Beispiel Paging durchführen.
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;
Ergebnis:
+------+-------+------+
| id | score | rank |
+------+-------+------+
| 4 | 17 | 2 |
| 1 | 17 | 2 |
+------+-------+------+
ACHTUNG :seit jetzt rank
eine berechnete Spalte ist, können Sie sie nicht indizieren und effizient weit in das Dataset blättern (dh "Datensätze mit Rängen von 3000 bis 3010 auswählen"). Aber es ist immer noch gut für "Top-N-Ränge auswählen" (vorausgesetzt, Sie setzen ein entsprechendes LIMIT
auf eine Abfrage)