Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL erhält den Rang von doppelten Werten basierend auf ihren Erstellungsdaten

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.