Det här borde vara ganska enkelt.
SELECT (CASE WHEN @fk <> fk_id THEN @row:=1 ELSE @row:[email protected] + 1 END) AS ordinality,
@fk:=fk_id, rcv_date
FROM (SELECT @row:=0) AS r,
(SELECT @fk:=0) AS f,
(SELECT fk_id, rcv_date FROM files ORDER BY fk_id, rcv_date) AS t
Jag beställde av fk_id
först för att säkerställa att alla dina främmande nycklar kommer ihop (tänk om de inte riktigt finns i tabellen?), sedan gjorde jag din föredragna beställning, dvs. senast rcv_date
. Frågan kontrollerar om det finns en ändring i fk_id och om det finns en, ställs radnummervariabeln till 1, annars ökas variabeln. Dess hanteras i ärendeutlåtande. Lägg märke till att @fk:=fk_id
görs efter ärendekontrollen annars kommer det att påverka radnumret.
Redigera: Lade precis märke till din egen lösning som råkade vara densamma som jag slutade med. Beröm! :)