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
Förklaring:
Här
, (select @rank := 0, @prevDate := null) var_init
variablerna initialiseras. Det är samma sak som att skriva
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Då är ordningen på kolumnerna i select-satsen viktig. Först kollar vi med den här raden
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
om den aktuella raden har samma datum som föregående rad. @prevDate innehåller värdet för föregående rad. Om ja, @rank
variabeln förblir densamma, om inte ökas den.
I nästa rad
@prevDate := create_date
vi ställer in @prevDate
variabel till värdet på den aktuella raden. Det är därför ordningen på kolumnerna i select
klausul är viktig.
Slutligen, eftersom vi kontrollerar med föregående rad, om datumen skiljer sig, order by
klausul är viktig.