Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL per aggiornare i record con data incrementata

Prova

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

Risultato:

|    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

Ecco SQLFiddle demo

Spiegazione:In una sottoquery con un alias t2 prendiamo tutte le righe dove la data È NULL le ordiniamo per id e assegna numeri di riga a partire da 1. Sfortunatamente MySql non ha un'implementazione per ROW_NUMBER() funzione quindi lo facciamo con una variabile utente @n che viene incrementato mentre le righe sono selezionate. Per inizializzare questa variabile utilizziamo una sottoquery con un alias i . E usa CROSS JOIN per renderlo disponibile per la nostra sottoquery t2 . Usiamo quindi la stessa tecnica (CROSS JOIN ) per prendere una data massima nella tabella e renderla disponibile per ogni riga nel nostro JOIN . Una volta che abbiamo tutto ciò, aggiungiamo semplicemente un numero di riga, che rappresenta un numero di giorni) aggiungilo alla data massima e assegna a date colonna nella nostra tabella.