1

我在尝试着

  1. 获取数据库中的最新日期,以及
  2. 根据该日期更新每条具有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

选择最新日期(起点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

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

4

2 回答 2

5

尝试

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

结果:

| 身份证 | 日期 |
----------------------
| 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我们表中的列。

于 2013-08-15T16:23:13.020 回答
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;
于 2013-08-15T01:11:21.927 回答