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
Dette fungerer på en meget enkel måde:
- Indledende forespørgsel er sorteret efter
id_class
førstid_student
sekund. @student
og@class
initialiseres til-1
@class
bruges til at teste om det næste sæt er indtastet. Hvis den forrige værdi afid_class
(som er gemt i@class
) er ikke lig med den aktuelle værdi (som er gemt iid_class
),@student
er nulstillet. Ellers øges den.@class
er tildelt den nye værdiid_class
, og det vil blive brugt i test på trin 3 på næste række.