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