Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie MySQL do aktualizacji rekordów o zwiększoną datę

Wypróbuj

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

Wynik:

|    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

Oto SQLFiddle demo

Wyjaśnienie:W podzapytaniu z aliasem t2 pobieramy wszystkie wiersze, w których data JEST NULL, uporządkuj je według id i przypisz numery wierszy zaczynając od 1. Niestety MySql nie ma implementacji dla ROW_NUMBER() funkcja, więc robimy to ze zmienną użytkownika @n który jest zwiększany podczas zaznaczania wierszy. Aby zainicjować tę zmienną, używamy podzapytania z aliasem i . I użyj CROSS JOIN aby udostępnić go dla naszego podzapytania t2 . Następnie używamy tej samej techniki (CROSS JOIN ), aby pobrać maksymalną datę w tabeli i udostępnić ją dla każdego wiersza w naszym JOIN . Kiedy już mamy wszystko, po prostu dodajemy numer linii, który reprezentuje liczbę dni) dodaj go do maksymalnej daty i przypisz do date kolumna w naszej tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql cte . używanie z i wstawianie ostrzega o błędzie składni

  2. Codeigniter Cart - zapisywanie danych w bazie danych - jak podejść?

  3. Jak przechowywać datę i czas w UTC w bazie danych za pomocą EclipseLink i Joda-Time?

  4. Jak sprawić, by mysql MEMORY ENGINE przechowywał więcej danych?

  5. Jak mogę zmienić indeksowany varchar (255) z utf8 na utf8mb4 i nadal pozostawać poniżej maksymalnej długości klucza 767?