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
Обяснение:
Тук
, (select @rank := 0, @prevDate := null) var_init
променливите се инициализират. Това е същото като писането
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Тогава редът на колоните в клаузата за избор е важен. Първо проверяваме с този ред
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
ако текущият ред има същата дата като предишния ред. @prevDate съдържа стойността на предишния ред. Ако да, @rank
променливата остава същата, ако не, тя се увеличава.
В следващия ред
@prevDate := create_date
задаваме @prevDate
променлива към стойността на текущия ред. Ето защо редът на колоните в select
клаузата е важна.
И накрая, тъй като проверяваме с предишния ред, ако датите се различават, order by
клаузата е важна.