Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So führen Sie ein gruppiertes Ranking in MySQL durch

SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= -1) s,
  (SELECT @class:= -1) c,
  (SELECT *
   FROM mytable
   ORDER BY id_class, id_student
  ) t

Das funktioniert ganz einfach:

  1. Anfangsabfrage wird nach id_class geordnet zuerst id_student zweitens.
  2. @student und @class werden auf -1 initialisiert
  3. @class wird verwendet, um zu testen, ob der nächste Satz eingegeben wird. Wenn der vorherige Wert der id_class (die in @class gespeichert ist ) ist nicht gleich dem aktuellen Wert (der in id_class gespeichert ist ), der @student ist genullt. Andernfalls wird inkrementiert.
  4. @class wird der neue Wert von id_class zugewiesen , und es wird im Test in Schritt 3 in der nächsten Zeile verwendet.