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
Detta fungerar på ett mycket enkelt sätt:
- Initial fråga är sorterad efter
id_class
först,id_student
andra. @student
och@class
initieras till-1
@class
används för att testa om nästa uppsättning matas in. Om det tidigare värdet förid_class
(som lagras i@class
) är inte lika med det aktuella värdet (som lagras iid_class
),@student
är nollställd. Annars ökas den.@class
tilldelas det nya värdetid_class
, och den kommer att användas i testet på steg 3 på nästa rad.