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_class
pertama,id_student
kedua. @student
dan@class
diinisialisasi ke-1
@class
digunakan 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
),@student
adalah nol. Jika tidak, akan bertambah.@class
ditugaskan dengan nilai baruid_class
, dan akan digunakan dalam pengujian pada langkah 3 di baris berikutnya.