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
Esto funciona de una manera muy sencilla:
- La consulta inicial está ordenada por
id_class
primero,id_student
segundo. @student
y@class
se inicializan a-1
@class
se utiliza para comprobar si se ha introducido el siguiente conjunto. Si el valor anterior deid_class
(que se almacena en@class
) no es igual al valor actual (que se almacena enid_class
), el@student
se pone a cero. De lo contrario, se incrementa.@class
se asigna con el nuevo valor deid_class
, y se usará en la prueba del paso 3 en la siguiente fila.