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
Isso funciona de uma maneira muito simples:
- A consulta inicial é ordenada por
id_class
primeiro,id_student
segundo. @student
e@class
são inicializados para-1
@class
é usado para testar se o próximo conjunto foi inserido. Se o valor anterior doid_class
(que é armazenado em@class
) não é igual ao valor atual (que é armazenado emid_class
), o@student
está zerado. Caso contrário, é incrementado.@class
é atribuído com o novo valor deid_class
, e será usado no teste da etapa 3 na próxima linha.