sql >> Database >  >> RDS >> Mysql

Eenvoudige MySQL-updaterang met banden

Hier is een alternatieve oplossing:sla helemaal geen rangen op! :-)

Je kunt ze in een oogwenk berekenen.

Voorbeeld:

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;

Resultaat:

  +------+----+-------+------+
  | 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 hier is een hulpkolom die aangeeft of we de volgende rang moeten toewijzen of niet.

U kunt deze zoekopdracht in een andere select plaatsen en bijvoorbeeld paging uitvoeren.

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;

Resultaat:

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

VOORZICHTIG :sinds nu rank een berekende kolom is, kunt u deze niet indexeren en efficiënt ver in de dataset bladeren (dat wil zeggen, "selecteer records met een rangorde van 3000 tot 3010"). Maar het is nog steeds goed voor "selecteer top N-rangen" (op voorwaarde dat u een overeenkomstige LIMIT plaatst op een vraag)



  1. Alles selecteren voor/na een bepaald teken in MySQL - SUBSTRING_INDEX()

  2. Cronjob of MySQL-event?

  3. Hoe ontsnap ik % van de python mysql-query?

  4. Welke karakters kunnen eigenlijk SQL-injectie in MySQL veroorzaken?