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*/;
次に、select句の列の順序が重要です。まず、この行で確認します
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
現在の行の日付が前の行と同じ場合。 @prevDateは、前の行の値を保持します。はいの場合、@rank
変数は、増分されない場合でも同じままです。
次の行で
@prevDate := create_date
@prevDate
を設定します 現在の行の値に可変。そのため、select
の列の順序 条項は重要です。
最後に、前の行で確認しているため、日付が異なる場合は、order by
条項は重要です。