Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfacher MySQL-Aktualisierungsrang mit Bindungen

Hier ist eine alternative Lösung:Ränge überhaupt nicht speichern! :-)

Sie können sie spontan berechnen.

Beispiel:

SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, 
           (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank 
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC;

Ergebnis:

  +------+----+-------+------+
  | id   | nr | score | rank |
  +------+----+-------+------+
  |    2 |  1 |    23 |    1 |
  |    4 |  1 |    17 |    2 |
  |    1 |  0 |    17 |    2 |
  |    5 |  1 |    10 |    3 |
  |    3 |  1 |     2 |    4 |
  +------+----+-------+------+

nr Hier ist eine Hilfsspalte, die angibt, ob wir den nächsten Rang zuweisen sollen oder nicht.

Sie können diese Abfrage in ein weiteres select einschließen und zum Beispiel Paging durchführen.

SELECT id, score, rank 
FROM (SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr, 
           (@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
      FROM rank, (SELECT @r := 0) dummy1
      ORDER BY score DESC) t
      WHERE rank > 1 and rank < 3;

Ergebnis:

  +------+-------+------+
  | id   | score | rank |
  +------+-------+------+
  |    4 |    17 |    2 |
  |    1 |    17 |    2 |
  +------+-------+------+

ACHTUNG :seit jetzt rank eine berechnete Spalte ist, können Sie sie nicht indizieren und effizient weit in das Dataset blättern (dh "Datensätze mit Rängen von 3000 bis 3010 auswählen"). Aber es ist immer noch gut für "Top-N-Ränge auswählen" (vorausgesetzt, Sie setzen ein entsprechendes LIMIT auf eine Abfrage)