Das sollte ziemlich einfach sein.
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
Ich habe nach fk_id
bestellt Zuerst um sicherzustellen, dass alle Ihre Fremdschlüssel zusammenkommen (was ist, wenn sie nicht wirklich in der Tabelle sind?), Dann habe ich Ihre bevorzugte Reihenfolge vorgenommen, dh nach rcv_date
. Die Abfrage prüft auf eine Änderung in fk_id, und wenn es eine gibt, wird die Zeilennummer-Variable auf 1 gesetzt, oder die Variable wird inkrementiert. Es wird in der Case-Anweisung behandelt. Beachten Sie, dass @fk:=fk_id
wird nach der Fallprüfung durchgeführt, sonst wirkt sich dies auf die Zeilennummer aus.
Bearbeiten: Ich habe gerade Ihre eigene Lösung bemerkt, die zufällig dieselbe war wie ich. Hut ab! :)