select
t.*,
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
@prevDate := create_date
from
your_table t
, (select @rank := 0, @prevDate := null) var_init
order by create_date, id
व्याख्या:
यहां
, (select @rank := 0, @prevDate := null) var_init
चर initalized हैं। यह लिखने जैसा ही है
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
फिर सेलेक्ट क्लॉज में कॉलम का क्रम महत्वपूर्ण है। सबसे पहले हम इस लाइन से जांचते हैं
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
यदि वर्तमान पंक्ति में पिछली पंक्ति के समान दिनांक है। @prevDate पिछली पंक्ति का मान रखता है। यदि हाँ, तो @rank
वेरिएबल वही रहता है, यदि नहीं तो इसे बढ़ाया जाता है।
अगली पंक्ति में
@prevDate := create_date
हमने @prevDate
. सेट किया है वर्तमान पंक्ति के मान के लिए चर। इसीलिए select
. में कॉलम का क्रम खंड महत्वपूर्ण है।
अंत में, चूंकि हम पिछली पंक्ति से जांच कर रहे हैं, यदि तिथियां भिन्न हैं, तो order by
खंड महत्वपूर्ण है।