Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Classificação de atualização simples do MySQL com laços


Aqui está uma solução alternativa:não armazene ranks! :-)

Você pode calculá-los na hora.

Exemplo:
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;

Resultado:
  +------+----+-------+------+
  | 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 aqui está uma coluna auxiliar que indica se devemos atribuir a próxima classificação ou não.

Você pode envolver esta consulta em outro select e realizar paginação, por exemplo.
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;

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

CUIDADO :desde agora rank é uma coluna calculada, você não pode indexá-la e paginar com eficiência no conjunto de dados (ou seja, "selecionar registros com classificações de 3000 a 3010"). Mas ainda é bom para "selecionar as principais N classificações" (desde que você coloque um LIMIT correspondente em uma consulta)