我在尝试着
NULL
我可以使用下面的“ 最新日期” 查询来获取最新日期。我首先需要执行此操作,因为表中的日期 不正确 。如果需要,我可以运行此查询,手动将其写下来,然后UPDATE根据该日期运行查询。我希望在没有手动过程的情况下运行所有内容。
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
选择最晚日期(从的起点UPDATE)
SELECT date FROM my_table ORDER BY date DESC LIMIT 1
更新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
我该怎么做?还是不可能?
尝试
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 | DATE | ---------------------- | 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表中的列即可。
id
ROW_NUMBER()
@n
i
CROSS JOIN
t2
JOIN
date