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
Uitleg:
Hier
, (select @rank := 0, @prevDate := null) var_init
de variabelen worden geïnitialiseerd. Het is hetzelfde als schrijven
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Dan is de volgorde van de kolommen in de select-clausule van belang. Eerst controleren we met deze regel
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
als de huidige rij dezelfde datum heeft als de vorige rij. De @prevDate bevat de waarde van de vorige rij. Zo ja, de @rank
variabele blijft hetzelfde, zo niet wordt deze verhoogd.
In de volgende regel
@prevDate := create_date
we stellen de @prevDate
. in variabele aan de waarde van de huidige rij. Daarom is de volgorde van de kolommen in de select
clausule is belangrijk.
Ten slotte, aangezien we met de vorige rij controleren, als de datums verschillen, de order by
clausule is belangrijk.