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
Giải thích:
Đây
, (select @rank := 0, @prevDate := null) var_init
các biến không được sinh ra. Nó cũng giống như viết
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Khi đó, thứ tự của các cột trong mệnh đề select là quan trọng. Đầu tiên, chúng tôi kiểm tra dòng này
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
nếu hàng hiện tại có cùng ngày với hàng trước đó. @PrevDate giữ giá trị của hàng trước đó. Nếu có, @rank
biến vẫn giữ nguyên, nếu không, nó sẽ tăng lên.
Trong dòng tiếp theo
@prevDate := create_date
chúng tôi đặt @prevDate
biến thành giá trị của hàng hiện tại. Đó là lý do tại sao thứ tự của các cột trong select
mệnh đề quan trọng.
Cuối cùng, vì chúng tôi đang kiểm tra với hàng trước, nếu ngày khác nhau, hãy đặt order by
mệnh đề quan trọng.