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
Cela fonctionne de manière très simple :
- La requête initiale est triée par
id_class
d'abord,id_student
seconde. @student
et@class
sont initialisés à-1
@class
est utilisé pour tester si le jeu suivant est entré. Si la valeur précédente deid_class
(qui est stocké dans@class
) n'est pas égal à la valeur actuelle (qui est stockée dansid_class
), le@student
est mis à zéro. Sinon, il est incrémenté.@class
est attribué avec la nouvelle valeur deid_class
, et il sera utilisé dans le test à l'étape 3 à la ligne suivante.