Mysql
 sql >> Database >  >> RDS >> Mysql

Classifica di aggiornamento MySQL semplice con legami

Ecco una soluzione alternativa:non memorizzare affatto i ranghi! :-)

Puoi calcolarli al volo.

Esempio:

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;

Risultato:

  +------+----+-------+------+
  | 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 ecco una colonna ausiliaria che indica se dobbiamo assegnare o meno il grado successivo.

Puoi racchiudere questa query in un altro select ed eseguire il paging, ad esempio.

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;

Risultato:

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

ATTENZIONE :da ora rank è una colonna calcolata, non è possibile indicizzarla e scorrere in modo efficiente una pagina lontana nel set di dati (ovvero "selezionare record con ranghi da 3000 a 3010"). Ma va comunque bene per "selezionare i primi N rank" (a condizione che tu metta un LIMIT corrispondente su una domanda)