Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL pour mettre à jour les enregistrements avec une date incrémentée

Essayez

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

Résultat :

|    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

Voici SQLFiddle démo

Explication :Dans une sous-requête avec un alias t2, nous récupérons toutes les lignes où la date EST NULL les trions par id et attribuez des numéros de ligne à partir de 1. Malheureusement, MySql n'a pas d'implémentation pour ROW_NUMBER() fonction donc nous le faisons avec une variable utilisateur @n qui est incrémenté pendant que les lignes sont sélectionnées. Pour initialiser cette variable, nous utilisons une sous-requête avec un alias i . Et utilisez CROSS JOIN pour le rendre disponible pour notre sous-requête t2 . On utilise ensuite la même technique (CROSS JOIN ) pour saisir une date maximale dans le tableau et la rendre disponible pour chaque ligne de notre JOIN . Une fois que nous avons tout cela, nous ajoutons simplement un numéro de ligne, qui représente un nombre de jours) ajoutez-le à la date max et attribuez-le à date colonne dans notre tableau.