Ich habe eine sehr einfache MySQL-Tabelle, in der ich Highscores speichere. Es sieht so aus:
Id Name Score
So weit, ist es gut. Die Frage ist: Wie bekomme ich den Rang eines Benutzers? Ich habe zum Beispiel einen Benutzer Name
oder Id
und möchte seinen Rang erhalten, bei dem alle Zeilen nach Ordnungszahl absteigend für den geordnet sind Score
.
Ein Beispiel
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
In diesem Fall Assem
wäre der Rang 3, weil er die dritthöchste Punktzahl hat.
Die Abfrage sollte eine Zeile zurückgeben, die (nur) den erforderlichen Rang enthält.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
ist nicht der beste Weg. Möglicherweise liegt ein Problem mit der Größe der erstellten Zeile vor.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Wobei "nur" die Anzahl der Einträge mit einer höheren Punktzahl als der aktuelle Eintrag zählt. (Wenn Sie hinzufügen, erhaltenDISTINCT
Sie den Rang ohne Lücken ..)Wenn mehrere Einträge dieselbe Punktzahl haben, sollte der nächste Rang nicht fortlaufend sein. Der nächste Rang sollte um die Anzahl der Punkte erhöht werden, die den gleichen Rang haben.
Um solche Ergebnisse anzuzeigen, sind zwei Rangvariablen erforderlich
Hier ist eine stabilere Version des Rankings mit Gleichstand:
Lassen Sie uns dies mit Beispieldaten ausprobieren. Hier sind die Beispieldaten:
Laden wir die Beispieldaten
Als nächstes initialisieren wir die Benutzervariablen:
Hier ist die Ausgabe der Abfrage:
Bitte beachten Sie, dass mehrere IDs, die dieselbe Punktzahl haben, denselben Rang haben. Beachten Sie auch, dass der Rang nicht fortlaufend ist.
Versuche es !!!
quelle
quelle
Eine Möglichkeit wäre die Verwendung von USER-Variablen:
quelle
Die akzeptierte Antwort weist ein potenzielles Problem auf. Wenn es zwei oder mehr identische Punkte gibt, gibt es Lücken in der Rangfolge. In diesem modifizierten Beispiel:
Die Punktzahl 58 hat Rang 5, und es gibt keinen Rang 4.
Wenn Sie sicherstellen möchten , dass es keine Lücken in der Rangliste, die Verwendung
DISTINCT
in derGROUP_CONCAT
eine Liste von verschiedenen Noten zu bauen:Ergebnis:
Dies funktioniert auch, um den Rang eines einzelnen Benutzers zu erhalten:
Ergebnis:
quelle
COUNT
Rangabfrage eines einzelnen Benutzers kann enorm optimiert werden, indem stattdessen eine Unterabfrage verwendet wird. Siehe meinen Kommentar bei der akzeptierten AntwortHier ist die beste Antwort:
Diese Abfrage gibt Folgendes zurück:
3
quelle
Diese Lösung ergibt
DENSE_RANK
im Falle von Unentschieden:quelle
Würde das folgende nicht funktionieren (vorausgesetzt, Ihre Tabelle heißt Scores)?
quelle
Ich habe diese, die die gleichen Ergebnisse wie die mit Variablen gibt. Es funktioniert mit Krawatten und es kann schneller sein:
Ich habe es nicht getestet, aber ich verwende eines, das perfekt funktioniert, und das ich an die Variablen angepasst habe, die Sie hier verwendet haben.
quelle