doi*_*tin 1 mysql sql date sql-date-functions sql-update
我在尝试着
NULL日期的记录,将日期增加 1 天。我可以使用下面的最新日期查询来获取最新日期。我需要先执行此操作,因为表中的日期未按顺序排列。如果需要,我可以运行此查询,手动将其写下来,然后UPDATE根据此日期运行查询。我宁愿在没有手动过程的情况下运行所有内容。
我在问题底部的最后一个查询是我尝试更新日期的测试查询,但是我没有运气让它工作。
表(日期不分先后)
id date
----- ----------
10500 2013-08-18
10501 2013-08-16
10502 2013-08-17
10503 2013-08-19
10504 NULL
10505 NULL
...
11800 NULL
11801 NULL
Run Code Online (Sandbox Code Playgroud)
选择最晚日期(起点UPDATE)
SELECT date
FROM my_table
ORDER BY date DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
更新NULL日期(不起作用)
UPDATE my_table
SET date = DATE_ADD((SELECT date FROM my_table ORDER BY date DESC LIMIT 1), INTERVAL 1 DAY)
WHERE date IS NULL
ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?或者这是不可能的?
尝试
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
Run Code Online (Sandbox Code Playgroud)
结果:
| 身份证 | 日期 | --------------- | 10500 | 2013-08-18 | | 10501 | 2013-08-16 | | 10502 | 2013-08-17 | | 10503 | 2013-08-19 | | 10504 | 2013-08-20 | -- 日期已分配 | 10505 | 2013-08-21 | -- 日期已分配
这是SQLFiddle演示
说明:在别名为 t2 的子查询中,我们获取日期为 NULL 的所有行,按顺序排列id并分配从 1 开始的行号。不幸的是,MySql 没有ROW_NUMBER()函数实现,因此我们使用用户变量进行操作@n,该变量在行被选中。为了初始化这个变量,我们使用一个带有别名的子查询i。并用于CROSS JOIN使其可用于我们的子查询t2。然后我们使用相同的技术 ( CROSS JOIN) 获取表中的最大日期,并使其可用于JOIN. 一旦我们拥有了一切,我们只需添加一个行号,它代表天数)将其添加到最大日期并分配给date我们表中的列。