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
Това работи по много прост начин:
- Първоначалната заявка е подредена по
id_class
първо,id_student
второ. @student
и@class
се инициализират на-1
@class
се използва за проверка дали е въведен следващият набор. Ако предишната стойност наid_class
(който се съхранява в@class
) не е равно на текущата стойност (която се съхранява вid_class
),@student
е нулиран. В противен случай се увеличава.@class
се присвоява с новата стойност наid_class
, и ще се използва в теста на стъпка 3 на следващия ред.