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
Działa to w bardzo prosty sposób:
- Początkowe zapytanie jest uporządkowane według
id_class
najpierwid_student
drugi. @student
i@class
są inicjowane do-1
@class
służy do sprawdzenia, czy wprowadzono następny zestaw. Jeśli poprzednia wartośćid_class
(który jest przechowywany w@class
) nie jest równa bieżącej wartości (która jest przechowywana wid_class
),@student
jest wyzerowany. W przeciwnym razie jest zwiększany.@class
ma przypisaną nową wartośćid_class
, i zostanie użyty w teście w kroku 3 w następnym wierszu.