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_classgeordnet zuerstid_studentzweitens. @studentund@classwerden auf-1initialisiert@classwird verwendet, um zu testen, ob der nächste Satz eingegeben wird. Wenn der vorherige Wert derid_class(die in@classgespeichert ist ) ist nicht gleich dem aktuellen Wert (der inid_classgespeichert ist ), der@studentist genullt. Andernfalls wird inkrementiert.@classwird der neue Wert vonid_classzugewiesen , und es wird im Test in Schritt 3 in der nächsten Zeile verwendet.