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_student2番目。 -
@studentおよび@class-1に初期化されます -
@class次のセットが入力されているかどうかをテストするために使用されます。id_classの以前の値の場合 (これは@classに保存されます )は現在の値(id_classに保存されている)と等しくありません )、@studentゼロになります。それ以外の場合はインクリメントされます。 -
@classid_classの新しい値が割り当てられます 、次の行のステップ3のテストで使用されます。