sql >> Databáze >  >> RDS >> Mysql

Dotaz MySQL pro aktualizaci záznamů se zvýšeným datem

Zkuste

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

Výsledek:

|    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

Zde je SQLFiddle demo

Vysvětlení:V dílčím dotazu s aliasem t2 vezmeme všechny řádky, kde je datum NULL, seřadíme je podle id a přiřaďte čísla řádků počínaje 1. MySql bohužel nemá implementaci pro ROW_NUMBER() tak to uděláme s uživatelskou proměnnou @n který se zvýší při výběru řádků. K inicializaci této proměnné používáme poddotaz s aliasem i . A použijte CROSS JOIN abychom jej zpřístupnili pro náš poddotaz t2 . Poté použijeme stejnou techniku ​​(CROSS JOIN ), abyste získali maximální datum v tabulce a zpřístupnili jej pro každý řádek v našem JOIN . Jakmile máme vše, jen přidáme číslo řádku, které představuje počet dní), přidáme jej k maximálnímu datu a přiřadíme k date sloupec v naší tabulce.



  1. mysql regex inverse (pouze pro použití REGEXP)

  2. mysql měnící jedinečný klíč na primární (mariadb)

  3. Node.js MySQL potřebuje trvalé připojení

  4. Rozlišovat malá a velká písmena v mysql?