代码之家  ›  专栏  ›  技术社区  ›  John Beasley

更新一定数量记录的连续日期

  •  -1
  • John Beasley  · 技术社区  · 6 月前

    我有一个MySQL 5.7表。

    我需要为9000条记录设置连续日期。

    前300条记录将有2025-01-02。

    接下来的300条记录将是2025-01-03。

    以此类推,直到所有9000个更新完毕,直到2025-01-31的最后日期。

    有没有一种方法可以通过一个查询来实现这一点?

    我不想这样做30次:

    UPDATE table SET date = '2025-01-02' ORDER RAND() LIMIT 300;
    

    这是我尝试过的:

    SET @row_num = 0;
    SET @start_date = '2025-01-02';
    
    UPDATE `DISTRIBUTION`
      JOIN (
        SELECT 
        `email`, 
        @row_num := @row_num + 1 AS row_num
    FROM `DISTRIBUTION`
    ) AS numbered_rows ON `DISTRIBUTION`.`email` = 
    numbered_rows.`email`
    SET `DISTRIBUTION`.`date_column` = DATE_ADD(@start_date, 
    INTERVAL FLOOR((row_num - 1) / 300) DAY)
    WHERE `LIST` = 'list1' AND `DOMAIN` = 'GM';
    

    但在尝试之后,它创造了2040年代和1930年代的记录。

    1 回复  |  直到 6 月前
        1
  •  0
  •   Barmar    6 月前

    我看不出你的查询不起作用的任何原因,它对我来说是有效的。但你可以通过省略 JOIN ,只是使用 @row_num 直接。

    set @row_num = -1;
    set @start_date = '2025-01-02';
    
    update distribution 
    set date_column = date_add(@start_date, interval floor((@row_num := @row_num + 1) / 300) day) 
    where list = 'list1' AND domain = 'GM'
    order by email;
    

    您必须进行初始化 @row_num -1 因为计算使用递增后的值。

    DEMO

    在链接的演示中,我的桌子较小,所以我使用了30人一组而不是300人一组,但原理是一样的。