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
Erklärung:
Hier
, (select @rank := 0, @prevDate := null) var_init
die Variablen werden initialisiert. Es ist dasselbe wie Schreiben
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Dann ist die Reihenfolge der Spalten in der select-Klausel wichtig. Zuerst prüfen wir mit dieser Zeile
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
wenn die aktuelle Zeile das gleiche Datum wie die vorherige Zeile hat. Das @prevDate enthält den Wert der vorherigen Zeile. Wenn ja, der @rank
Variable bleibt gleich, wenn nicht wird sie erhöht.
In der nächsten Zeile
@prevDate := create_date
wir setzen das @prevDate
Variable auf den Wert der aktuellen Zeile. Deshalb die Reihenfolge der Spalten im select
Klausel ist wichtig.
Schließlich, da wir mit der vorherigen Zeile prüfen, ob sich die Daten unterscheiden, die order by
Klausel ist wichtig.