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
Ini bekerja dengan cara yang sangat sederhana:
- Kueri awal diurutkan berdasarkan
id_classpertama,id_studentkedua. @studentdan@classdiinisialisasi ke-1@classdigunakan untuk menguji apakah set berikutnya dimasukkan. Jika nilai sebelumnya dariid_class(yang disimpan di@class) tidak sama dengan nilai saat ini (yang disimpan diid_class),@studentadalah nol. Jika tidak, akan bertambah.@classditugaskan dengan nilai baruid_class, dan akan digunakan dalam pengujian pada langkah 3 di baris berikutnya.