Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL obtient le classement des valeurs en double en fonction de leurs dates de création

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

Explication :

Ici

, (select @rank := 0, @prevDate := null) var_init

les variables sont initialisées. C'est comme écrire

set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;

Ensuite, l'ordre des colonnes dans la clause select est important. Nous vérifions d'abord avec cette ligne

@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,

si la ligne courante a la même date que la ligne précédente. Le @prevDate contient la valeur de la ligne précédente. Si oui, le @rank la variable reste la même, sinon elle est incrémentée.

Dans la ligne suivante

@prevDate := create_date

nous définissons le @prevDate variable à la valeur de la ligne courante. C'est pourquoi l'ordre des colonnes dans le select clause est importante.

Enfin, puisque nous vérifions avec la ligne précédente, si les dates diffèrent, le order by clause est importante.