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
Penjelasan:
Disini
, (select @rank := 0, @prevDate := null) var_init
variabel diinisialisasi. Sama halnya dengan menulis
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Maka urutan kolom dalam klausa pilih adalah penting. Pertama kita periksa dengan baris ini
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
jika baris saat ini memiliki tanggal yang sama dengan baris sebelumnya. @prevDate menyimpan nilai dari baris sebelumnya. Jika ya, @rank variabel tetap sama, jika tidak maka akan bertambah.
Di baris berikutnya
@prevDate := create_date
kami mengatur @prevDate variabel ke nilai baris saat ini. Itu sebabnya urutan kolom di select klausa itu penting.
Terakhir, karena kami memeriksa dengan baris sebelumnya, jika tanggalnya berbeda, order by klausa itu penting.