Rang basierend auf mehreren Spalten in MySQL bestimmen
Beim Arbeiten mit Daten in MySQL ist es oft notwendig, den Rang von Zeilen basierend zu bestimmen nach bestimmten Kriterien. In diesem Fall besteht die Aufgabe darin, die Benutzer auf der Grundlage der Benutzer-ID und der Spiel-ID zu bewerten, wobei die Rangfolge in absteigender Reihenfolge der Spieldetails geordnet wird.
Um dieses Problem zu lösen, verwenden wir eine Unterabfrage, um die Daten wie folgt zu ordnen dass alle Zeilen mit der gleichen Benutzer-ID gruppiert werden und eine weitere Sortierung zwischen ihnen basierend auf Spieldetails in absteigender Reihenfolge erfolgt. Dann verwenden wir bedingte CASE..WHEN-Ausdrücke, um die Zeilennummerierung auszuwerten und Benutzerspielränge zuzuweisen.
Die folgende SQL-Abfrage bietet eine Lösung:
SET @r := 0, @u := 0; SELECT @r := CASE WHEN @u = dt.user_id THEN @r + 1 WHEN @u := dt.user_id /* Notice := instead of = */ THEN 1 END AS user_game_rank, dt.user_id, dt.game_detail, dt.game_id FROM ( SELECT user_id, game_id, game_detail FROM game_logs ORDER BY user_id, game_detail DESC ) AS dt
In der Abfrage verwenden wir Benutzerdefinierte Variablen @r und @u, um Zeilenrankings und Benutzer-IDs zu verfolgen. Wir stellen sicher, dass die Auswertung von user_game_rank und der Benutzer-ID-Zuweisung zu @u innerhalb desselben Ausdrucks erfolgt, um ihre korrekte Reihenfolge beizubehalten.
Das Ergebnis dieser Abfrage liefert die Benutzerspielränge wie gewünscht:
| user_game_rank | user_id | game_detail | game_id | | -------------- | ------- | ----------- | ------- | | 1 | 6 | 260 | 11 | | 2 | 6 | 100 | 10 | | 1 | 7 | 1200 | 10 | | 2 | 7 | 500 | 11 | | 3 | 7 | 260 | 12 | | 4 | 7 | 50 | 13 |
Für MySQL 8.0 und höher ist die Verwendung der Funktion Row_Number() ein effizienterer Ansatz, mit der Zeilenrankings basierend auf den angegebenen Werten direkt berechnet werden können Kriterien:
SELECT user_id, game_id, game_detail, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY game_detail DESC) AS user_game_rank FROM game_logs ORDER BY user_id, user_game_rank;
Diese Abfrage liefert die gleiche Ausgabe wie die vorherige, bietet jedoch eine verbesserte Leistung und ist die empfohlene Methode für das Zeilenranking in MySQL 8.0.
Das obige ist der detaillierte Inhalt vonWie ordne ich Benutzer basierend auf mehreren Spalten in MySQL ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!