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:
- Anfangsabfrage wird nach
id_class
geordnet zuerstid_student
zweitens. @student
und@class
werden auf-1
initialisiert@class
wird verwendet, um zu testen, ob der nächste Satz eingegeben wird. Wenn der vorherige Wert derid_class
(die in@class
gespeichert ist ) ist nicht gleich dem aktuellen Wert (der inid_class
gespeichert ist ), der@student
ist genullt. Andernfalls wird inkrementiert.@class
wird der neue Wert vonid_class
zugewiesen , und es wird im Test in Schritt 3 in der nächsten Zeile verwendet.