MySQL查询以更新日期更新记录

时间:2013-08-15 01:07:47

标签: mysql sql date sql-update sql-date-functions

我正在尝试

  1. 在数据库中获取最新日期,
  2. 根据该日期更新每个NULL日期的记录,将日期增加1天。
  3. 我可以使用下面的最新日期查询获取最新日期。我需要先执行此操作,因为表中的日期依次为。如果需要,我可以运行此查询,手动将其写下来,然后根据此日期运行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
    

    我怎样才能做到这一点?或者这不可能吗?

2 个答案:

答案 0 :(得分:3)

尝试

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 | --  date has been assigned
| 10505 | 2013-08-21 | --  date has been assigned

这是 SQLFiddle 演示

说明:在带有别名t2的子查询中,我们获取所有行,其中date为NULL,按id对它们进行排序,并从1开始分配行号。不幸的是,MySql没有实现ROW_NUMBER()函数,因此我们使用用户变量@n来执行此操作,该变量在选择行时递增。要初始化此变量,我们使用带有别名i的子查询。并使用CROSS JOIN使其可用于我们的子查询t2。然后,我们使用相同的技术(CROSS JOIN)来获取表格中的最大日期,并使其可用于JOIN中的每一行。我们只需添加一个行号(代表天数),将其添加到最大日期并分配到表格中的date列。

答案 1 :(得分:1)

改为使用join语法:

UPDATE my_table cross join
       (SELECT max(date) as maxdate FROM my_table) const
SET my_table.date = DATE_ADD(const.maxdate, INTERVAL 1 DAY)
WHERE my_table.date IS NULL;