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
Funguje to velmi jednoduchým způsobem:
- Počáteční dotaz je uspořádán podle
id_class
nejprveid_student
za druhé. @student
a@class
jsou inicializovány na-1
@class
se používá k testování, zda je zadána další sada. Pokud je předchozí hodnotaid_class
(který je uložen v@class
) se nerovná aktuální hodnotě (která je uložena vid_class
),@student
je vynulován. V opačném případě se hodnota zvýší.@class
je přiřazena nová hodnotaid_class
a bude použit v testu v kroku 3 na dalším řádku.