Опитайте
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
Резултат:
<пред>| ID | ДАТА |---------------------| 10500 | 2013-08-18 || 10501 | 2013-08-16 || 10502 | 2013-08-17 || 10503 | 2013-08-19 || 10504 | 20.08.2013 | -- датата е назначена| 10505 | 21.08.2013 | -- датата е назначенаЕто SQLPiddle демонстрация
Обяснение:В подзаявка с псевдоним t2 ние грабваме всички редове, където датата е NULL, ги подреждаме по id
и задайте номера на редове, започващи от 1. За съжаление MySql няма реализация за ROW_NUMBER()
функция, така че го правим с потребителска променлива @n
което се увеличава, докато се избират редове. За да инициализираме тази променлива, използваме подзаявка с псевдоним i
. И използвайте CROSS JOIN
за да го направим достъпен за нашата подзаявка t2
. След това използваме същата техника (CROSS JOIN
), за да вземете максимална дата в таблицата и да я направите достъпна за всеки ред в нашия JOIN
. След като имаме всичко, просто добавяме номер на ред, който представлява брой дни) добавяме го към максималната дата и присвояваме на date
колона в нашата таблица.