Mysql
 sql >> база данни >  >> RDS >> Mysql

Прост ранг за актуализиране на MySQL с връзки

Ето алтернативно решение:изобщо не съхранявайте рангове! :-)

Можете да ги изчислите в движение.

Пример:

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;

Резултат:

  +------+----+-------+------+
  | 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 тук има помощна колона, която показва дали трябва да присвоим следващ ранг или не.

Можете да обвиете тази заявка в друг select и извършете пейджинг, например.

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;

Резултат:

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

ВНИМАНИЕ :от сега rank е изчислена колона, не можете да я индексирате и ефективно да страниците далеч в набора от данни (тоест „изберете записи с ранг от 3000 до 3010“). Но все пак е добре за „изберете топ N ранга“ (при условие, че сте поставили съответен LIMIT на заявка)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Count записва в рамките на един месец, използвайки unix времеви печат

  2. Алтернатива на NOT IN на MySQL

  3. Мигриране на Google Cloud SQL за MySQL към On-Prem сървър

  4. Задействайте повиквания при каскадно изтриване

  5. Изберете всички дублиращи се редове въз основа на една или две колони?