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_classnejprveid_studentza druhé. @studenta@classjsou inicializovány na-1@classse 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),@studentje vynulován. V opačném případě se hodnota zvýší.@classje přiřazena nová hodnotaid_classa bude použit v testu v kroku 3 na dalším řádku.