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

Simpel MySQL-opdateringsrangering med bånd

Her er en alternativ løsning:Gem ikke rækker overhovedet! :-)

Du kan beregne dem i farten.

Eksempel:

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 her er en hjælpekolonne, der angiver, om vi skal tildele næste rang eller ej.

Du kan ombryde denne forespørgsel i en anden select og udfør f.eks. personsøgning.

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 | +------+-------+------+

FORSIGTIG :siden nu rank er en beregnet kolonne, kan du ikke indeksere den og effektivt side langt ind i datasættet (det vil sige "vælg poster med rang fra 3000 til 3010"). Men det er stadig godt for "vælg top N rækker" (forudsat at du angiver en tilsvarende LIMIT på en forespørgsel)



  1. Sidder fast med adgang nægtet for brugeren 'root'@'localhost' - Terminal, Mac

  2. Sådan beregnes daglige aktive brugere (DAU) i MySQL

  3. Opret en visning i SQL Server 2017

  4. Rekursive kategorier med en enkelt forespørgsel?