sql >> Databáze >  >> RDS >> Mysql

Jednoduchá aktualizace MySQL Rank s vazbami

Zde je alternativní řešení:neukládat hodnocení vůbec! :-)

Můžete je vypočítat za běhu.

Příklad:

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;

Výsledek:

  +------+----+-------+------+
  | 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 zde je pomocný sloupec, který ukazuje, zda bychom měli přiřadit další hodnost nebo ne.

Tento dotaz můžete zabalit do jiného select a provádějte například stránkování.

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;

Výsledek:

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

POZOR :od nynějška rank je vypočítaný sloupec, nemůžete jej indexovat a efektivně stránkovat daleko do datové sady (tj. "vybrat záznamy s hodnocením od 3000 do 3010"). Ale stále je to dobré pro "vybrat nejlepších N hodnocení" (za předpokladu, že vložíte odpovídající LIMIT na dotaz)



  1. je `date` platný název sloupce mysql?

  2. mysql abecední pořadí

  3. Jak vytvořit více jeden k jednomu

  4. Nejlepší úložiště dat pro miliardy řádků