sql >> Databasteknik >  >> RDS >> Mysql

Enkel MySQL-uppdateringsrankning med band

Här är en alternativ lösning:lagra inte rankningar alls! :-)

Du kan beräkna dem i farten.

Exempel:

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;

Resultat:

  +------+----+-------+------+
  | 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 här är en extra kolumn som indikerar om vi ska tilldela nästa rang eller inte.

Du kan slå in den här frågan i en annan select och utföra personsökning, till exempel.

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;

Resultat:

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

VARNING :sedan nu rank är en beräknad kolumn, kan du inte indexera den och effektivt bläddra långt in i datamängden (det vill säga "välj poster med rankningar från 3000 till 3010"). Men det är fortfarande bra för "select top N ranks" (förutsatt att du anger en motsvarande LIMIT på en fråga)



  1. Hur kartlägger man in- och utdatakolumner dynamiskt i SSIS?

  2. Hur man hittar pg_config sökväg

  3. EF6 MySql:Update-Database -Script genererar SQL utan semikolon

  4. Upptäck om ett datum är i sommartid i MySql