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
Funziona in modo molto semplice:
- La query iniziale è ordinata per
id_class
prima,id_student
secondo. @student
e@class
sono inizializzati su-1
@class
viene utilizzato per verificare se viene immessa la serie successiva. Se il valore precedente diid_class
(che è memorizzato in@class
) non è uguale al valore corrente (che è memorizzato inid_class
), il@student
è azzerato. Altrimenti viene incrementato.@class
viene assegnato il nuovo valore diid_class
e verrà utilizzato nel test del passaggio 3 nella riga successiva.