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
Vysvětlení:
Zde
, (select @rank := 0, @prevDate := null) var_init
proměnné jsou inicializovány. Je to stejné jako psaní
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Pak je důležité pořadí sloupců v klauzuli select. Nejprve zkontrolujeme tento řádek
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
pokud má aktuální řádek stejné datum jako předchozí řádek. @prevDate obsahuje hodnotu předchozího řádku. Pokud ano, @rank
proměnná zůstává stejná, pokud ne, je inkrementována.
V dalším řádku
@prevDate := create_date
nastavíme @prevDate
proměnné na hodnotu aktuálního řádku. To je důvod, proč pořadí sloupců v select
klauzule je důležitá.
A konečně, protože kontrolujeme s předchozím řádkem, pokud se data liší, order by
klauzule je důležitá.