MySQL Rang mit Bindungen
Ich bin neu in SQL und habe noch nie Variablen oder Bedingungen in MySQL verwendet, kenne diese jedoch aus anderen Programmiersprachen. Seit ein paar Tagen versuche ich, einen Weg zu finden, um eine User-Bewertung zu erhalten. Ich habe viele Artikel gelesen und auch Fragen zum Stackoverflow gestellt. Schließlich habe ich eine Lösung gefunden, die beinahe so funktioniert, wie ich es möchte.
SELECT
score_users.uid,
score_users.score,
@prev := @curr,
@curr := score,
@rank := IF(@prev = @curr, @rank, @rank +1) AS rank
FROM
score_users,
(SELECT @curr := null, @prev := null, @rank := 0) tmp_tbl
WHERE
score_users.matchday = 1
ORDER BY
score_users.score DESC
Aber meine Probleme sind Unentschieden. Ich möchte keine aufeinanderfolgenden Ränge erhalten, so:
+------------+------+--------+
| uid | name | rank | score |
+------------+------+--------+
| 4 | Jon | 1 | 20 |
| 1 | Jane | 2 | 19 |
| 2 | Fred | 2 | 19 |
| 9 | July | 3 | 18 |
| 7 | Mary | 4 | 17 |
| 3 | Toni | 5 | 12 |
| 5 | Steve | 5 | 12 |
| 6 | Peter | 6 | 11 |
| 8 | Nina | 7 | 10 |
+------------+------+--------+
Ich möchte folgendes Ergebnis erhalten:
+------------+------+--------+
| uid | name | rank | score |
+------------+------+--------+
| 4 | Jon | 1 | 20 |
| 1 | Jane | 2 | 19 |
| 2 | Fred | 2 | 19 |
| 9 | July | 4 | 18 |
| 7 | Mary | 5 | 17 |
| 3 | Toni | 6 | 12 |
| 5 | Steve | 6 | 12 |
| 6 | Peter | 8 | 11 |
| 8 | Nina | 9 | 10 |
+------------+------+--------+
Ich denke, ich muss eine neue temporäre Tabelle erstellen und einige Bedingungen, aber ich konnte keine Lösung finden und wurde verzweifelt! Außerdem muss ich ein Auge auf die Leistung haben. Vielleicht gibt es bessere Möglichkeiten, den Rang in der Punktzahl so zu bekommen, wie ich es getan habe. Für Hinweise oder Code-Schnipsel wäre ich sehr dankbar.