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
Điều này hoạt động theo một cách rất đơn giản:
- Truy vấn ban đầu được sắp xếp theo
id_class
đầu tiên,id_student
thứ hai. -
@student
và@class
được khởi tạo thành-1
-
@class
được sử dụng để kiểm tra xem tập tiếp theo có được nhập hay không. Nếu giá trị trước đó củaid_class
(được lưu trữ trong@class
) không bằng giá trị hiện tại (được lưu trữ trongid_class
),@student
là 0. Nếu không thì là tăng dần. -
@class
được gán với giá trị mới làid_class
và nó sẽ được sử dụng trong thử nghiệm ở bước 3 ở hàng tiếp theo.