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

MySQL-Abfrage zum Aktualisieren von Datensätzen mit inkrementiertem Datum

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.