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
Dit werkt op een heel eenvoudige manier:
- Eerste zoekopdracht is gerangschikt op
id_class
eerst,id_student
tweede. @student
en@class
worden geïnitialiseerd op-1
@class
wordt gebruikt om te testen of de volgende set wordt ingevoerd. Als de vorige waarde van deid_class
(die is opgeslagen in@class
) is niet gelijk aan de huidige waarde (die is opgeslagen inid_class
), de@student
wordt op nul gezet. Anders wordt het verhoogd.@class
wordt toegewezen met de nieuwe waardeid_class
, en het wordt gebruikt in de test bij stap 3 in de volgende rij.