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
Forklaring:
Her
, (select @rank := 0, @prevDate := null) var_init
variablerne initialiseres. Det er det samme som at skrive
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Så er rækkefølgen af kolonnerne i select-klausulen vigtig. Først tjekker vi med denne linje
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
hvis den aktuelle række har samme dato som den foregående række. @prevDate indeholder værdien af den forrige række. Hvis ja, @rank
variabel forbliver den samme, hvis ikke, øges den.
I næste linje
@prevDate := create_date
vi indstiller @prevDate
variabel til værdien af den aktuelle række. Det er derfor rækkefølgen af kolonnerne i select
klausul er vigtig.
Til sidst, da vi tjekker med den forrige række, hvis datoerne er forskellige, order by
klausul er vigtig.