Versuchen Sie es
UPDATE Table1 t1 JOIN
(
SELECT id, @n := @n + 1 rnum
FROM Table1 CROSS JOIN (SELECT @n := 0) i
WHERE date IS NULL
ORDER BY id
) t2 ON t1.id = t2.id CROSS JOIN
(
SELECT MAX(date) date FROM Table1
) q
SET t1.date = q.date + INTERVAL t2.rnum DAY
Ergebnis:
| ID | DATE | ---------------------- | 10500 | 2013-08-18 | | 10501 | 2013-08-16 | | 10502 | 2013-08-17 | | 10503 | 2013-08-19 | | 10504 | 2013-08-20 | -- date has been assigned | 10505 | 2013-08-21 | -- date has been assigned
Hier ist SQLFiddle Demo
Erläuterung:In einer Unterabfrage mit einem Alias t2 greifen wir alle Zeilen, in denen date NULL ist, und sortieren sie nach id
und weisen Sie Zeilennummern beginnend bei 1 zu. Leider hat MySql keine Implementierung für ROW_NUMBER()
Funktion, also machen wir es mit einer Benutzervariable @n
die inkrementiert wird, während Zeilen ausgewählt werden. Um diese Variable zu initialisieren, verwenden wir eine Unterabfrage mit einem Alias i
. Und verwenden Sie CROSS JOIN
um es für unsere Unterabfrage t2
verfügbar zu machen . Wir verwenden dann die gleiche Technik (CROSS JOIN
), um ein maximales Datum in der Tabelle zu erfassen und es für jede Zeile in unserem JOIN
verfügbar zu machen . Sobald wir alles haben, fügen wir einfach eine Zeilennummer hinzu, die eine Anzahl von Tagen darstellt, fügen sie zum maximalen Datum hinzu und weisen sie date
zu Spalte in unserer Tabelle.