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.