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
Spiegazione:
Qui
, (select @rank := 0, @prevDate := null) var_init
le variabili vengono inizializzate. È come scrivere
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Quindi l'ordine delle colonne nella clausola select è importante. Per prima cosa controlliamo con questa riga
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
se la riga corrente ha la stessa data della riga precedente. @prevDate contiene il valore della riga precedente. Se sì, il @rank
la variabile rimane la stessa, in caso contrario viene incrementata.
Nella riga successiva
@prevDate := create_date
impostiamo il @prevDate
variabile al valore della riga corrente. Ecco perché l'ordine delle colonne nel select
la clausola è importante.
Infine, poiché stiamo verificando con la riga precedente, se le date differiscono, il order by
la clausola è importante.