Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Prosty ranking aktualizacji MySQL z więzami

Oto alternatywne rozwiązanie:nie przechowuj w ogóle rang! :-)

Możesz je obliczyć na bieżąco.

Przykład:

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;

Wynik:

  +------+----+-------+------+
  | 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 tutaj znajduje się kolumna pomocnicza, która wskazuje, czy powinniśmy przypisać kolejną rangę, czy nie.

Możesz opakować to zapytanie w inny select i na przykład wykonuj stronicowanie.

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;

Wynik:

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

UWAGA :od teraz rank jest kolumną obliczeniową, nie można jej zindeksować i wydajnie stronicować daleko w zbiorze danych (tzn. „wybierz rekordy z rangami od 3000 do 3010”). Ale nadal jest dobry dla „wybierz najwyższe N ​​rang” (pod warunkiem, że umieścisz odpowiedni LIMIT na zapytanie)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klucz obcy MySQL InnoDB między różnymi bazami danych

  2. Najlepszy sposób na utworzenie pliku konfiguracyjnego (config.php) php

  3. Jak używać polecenia „select” w instrukcji „insert” MySQL

  4. Czy kolumny tabeli z kluczem obcym mogą mieć wartość NULL?

  5. MySQL Gdzie data jest większa niż jeden miesiąc?