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
Explicação:
Aqui
, (select @rank := 0, @prevDate := null) var_init
as variáveis são inicializadas. É o mesmo que escrever
set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;
Então a ordem das colunas na cláusula select é importante. Primeiro verificamos com esta linha
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
se a linha atual tiver a mesma data da linha anterior. O @prevDate contém o valor da linha anterior. Se sim, o
@rank
variável permanece a mesma, se não for incrementada. Na próxima linha
@prevDate := create_date
definimos o
@prevDate
variável para o valor da linha atual. É por isso que a ordem das colunas no select
cláusula é importante. Por fim, como estamos verificando com a linha anterior, se as datas forem diferentes, o
order by
cláusula é importante.