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_classd'abord,id_studentseconde. @studentet@classsont initialisés à-1@classest 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@studentest mis à zéro. Sinon, il est incrémenté.@classest attribué avec la nouvelle valeur deid_class, et il sera utilisé dans le test à l'étape 3 à la ligne suivante.