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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage