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
Explication :
Ici
, (select @rank := 0, @prevDate := null) var_init
les variables sont initialisées. C'est comme écrire
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Ensuite, l'ordre des colonnes dans la clause select est important. Nous vérifions d'abord avec cette ligne
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
si la ligne courante a la même date que la ligne précédente. Le @prevDate contient la valeur de la ligne précédente. Si oui, le @rank
la variable reste la même, sinon elle est incrémentée.
Dans la ligne suivante
@prevDate := create_date
nous définissons le @prevDate
variable à la valeur de la ligne courante. C'est pourquoi l'ordre des colonnes dans le select
clause est importante.
Enfin, puisque nous vérifions avec la ligne précédente, si les dates diffèrent, le order by
clause est importante.