Update der Rang in einer MySQL-Tabelle
Ich habe folgende Tabellenstruktur für Tabelle Spieler
Table Player {
Long playerID;
Long points;
Long rank;
}
Unter der Annahme, dass die playerID und die Punkte haben gültige Werte, kann ich ein update der Rang für alle die Spieler basierend auf der Anzahl der Punkte in einer einzigen Abfrage? Wenn zwei Personen die gleiche Anzahl von Punkten, sollten Sie die Krawatte für den Rang.
UPDATE:
Ich bin mit hibernate über die query vorgeschlagen, als eine native Abfrage. Hibernate nicht wie die Verwendung von Variablen, insbesondere die ':'. Kennt jemand irgendwelche workarounds? Entweder durch nicht verwenden von Variablen oder arbeiten rund um hibernate ist eine Einschränkung in diesem Fall durch die Verwendung von HQL?
- In Bezug auf Ihre Bearbeitung, auf hibernate, möchten Sie vielleicht post eine neue Frage, wie es bekommen mehr Aufmerksamkeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit ist die Verwendung einer ranking-variable, wie die folgenden:
Den
JOIN (SELECT @curRank := 0)
Teil ermöglicht die Initialisierung der Variablen, ohne dass ein separatesSET
Befehl.Weitere Lektüre zu diesem Thema:
Test-Fall:
Ergebnis:
UPDATE: ist Nur aufgefallen, das, die Sie benötigen Krawatten den gleichen Rang. Das ist ein bisschen tricky, aber kann gelöst werden, mit noch mehr Variablen:
Für einen Testfall, fügen wir anderen Spieler mit 175 Punkten:
Ergebnis:
Und wenn Sie den Rang zu überspringen, ein Ort im Falle eines Unentschiedens, können Sie weitere hinzufügen
IF
Zustand:Ergebnis:
Hinweis: Bitte beachten Sie, dass die Abfragen, die ich Vorschlage, könnte weiter vereinfacht werden.
Daniel, du hast sehr schöne Lösung. Außer einem Punkt - die Band-Fall. Wenn Band geschieht zwischen 3-Spieler dieses update funktioniert nicht richtig. Ich änderte Ihre Lösung wie folgt:
EDIT: Die update-Anweisung, die weiter oben dargestellt hast, nicht funktionieren.
Obwohl dies nicht genau das, was Sie fordern: Sie erzeugen den Rang on-the-fly bei der Auswahl:
EDIT: Versucht die UPDATE-Anweisung einmal mehr. Wie wäre es mit einer temporären Tabelle:
Hoffe, das hilft.
You can't specify target table 'p1' for update in FROM clause
, weil derp1
Referenz in der subquery.SELECT
Zeit, aber es wird noch nicht mit Krawatten. Die OP selbst tagged die Frage "Unentschieden"! 🙂SELECT p1.points, p1.playerID, 1 + (select count(playerID) FROM Player p2 WHERE p2.points > p1.points) rank FROM player p1 ORDER BY rank;
Laut Normalisierungsregeln, Rang sollte bewertet werden WÄHLEN Sie Zeit.