Ich habe die folgende Tabellenstruktur für einen Tabellenplayer
%Vor%Angenommen, dass die playerID und die Punkte gültige Werte haben, kann ich den Rang für alle Spieler basierend auf der Anzahl der Punkte in einer einzelnen Abfrage aktualisieren? Wenn zwei Personen die gleiche Anzahl von Punkten haben, sollten sie für den Rang binden.
UPDATE:
Ich verwende Hibernate mit der Abfrage, die als native Abfrage vorgeschlagen wurde. Hibernate verwendet keine Variablen, insbesondere das ':'. Kennt jemand Workarounds? Entweder indem Sie keine Variablen verwenden oder die Einschränkung des Winterschlafs in diesem Fall mit HQL umgehen?
Eine Option ist die Verwendung einer Ranking-Variablen wie die folgende:
%Vor% Der JOIN (SELECT @curRank := 0)
-Teil erlaubt die Initialisierung der Variablen, ohne dass ein separater Befehl SET
benötigt wird.
Weitere Informationen zu diesem Thema:
Testfall:
%Vor%Ergebnis:
%Vor%UPDATE: Habe gerade bemerkt, dass du Verbindungen benötigst, um denselben Rang zu teilen. Dies ist ein bisschen schwierig, aber kann mit noch mehr Variablen gelöst werden:
%Vor%Für einen Testfall fügen wir einen weiteren Spieler mit 175 Punkten hinzu:
%Vor%Ergebnis:
%Vor% Und wenn Sie im Falle eines Unentschiedens den Rang benötigen, um einen Platz zu überspringen, können Sie eine weitere IF
Bedingung hinzufügen:
Ergebnis:
%Vor%Hinweis: Bitte beachten Sie, dass die von mir vorgeschlagenen Abfragen weiter vereinfacht werden könnten.
Daniel, du hast eine sehr schöne Lösung. Bis auf einen Punkt - den Krawattenkoffer. Wenn eine Verbindung zwischen 3 Spielern besteht, funktioniert dieses Update nicht richtig. Ich habe Ihre Lösung wie folgt geändert:
%Vor%EDIT: Die Update-Anweisung, die früher vorgestellt wurde, hat nicht funktioniert.
Obwohl dies nicht genau das ist, wonach Sie fragen: Sie können den Rang im laufenden Betrieb generieren, wenn Sie Folgendes auswählen:
%Vor%EDIT: Erneutes Testen der UPDATE-Anweisung. Wie wäre es mit einer temporären Tabelle:
%Vor%Hoffe, das hilft.
Gemäß den Normalisierungsregeln sollte der Rang zur SELECT-Zeit ausgewertet werden.