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
Wyjaśnienie:
Tutaj
, (select @rank := 0, @prevDate := null) var_init
zmienne są inicjowane. To tak samo jak pisanie
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Wtedy ważna jest kolejność kolumn w klauzuli select. Najpierw sprawdzamy tą linią
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
jeśli bieżący wiersz ma taką samą datę jak poprzedni wiersz. @prevDate przechowuje wartość poprzedniego wiersza. Jeśli tak, @rank
zmienna pozostaje taka sama, jeśli nie jest zwiększana.
W następnym wierszu
@prevDate := create_date
ustawiamy @prevDate
zmienna na wartość bieżącego wiersza. Dlatego kolejność kolumn w select
klauzula jest ważna.
Wreszcie, ponieważ sprawdzamy w poprzednim wierszu, jeśli daty się różnią, order by
klauzula jest ważna.