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_classprimeiro,id_studentsegundo. @studente@classsã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@studentestá 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.