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 पर परीक्षण में किया जाएगा।