MySQL 8如何按日期时间升序为dotable表的priority字段赋值
实现方案
你使用的是MySQL 8.0版本,支持窗口函数,可通过UPDATE结合ROW_NUMBER()窗口函数的方式实现需求,具体方案如下:
核心逻辑
先筛选出当天的所有记录,按dt字段从小到大排序生成连续行号,再将行号赋值给对应记录的priority字段。
具体SQL代码
UPDATE dotable d INNER JOIN ( SELECT dt, -- 按时间升序生成从1开始的连续序号 ROW_NUMBER() OVER(ORDER BY dt ASC) AS row_num FROM dotable -- 筛选当前日期的记录,如需指定日期可替换为 DATE(dt) = '2021-08-10' WHERE DATE(dt) = CURDATE() ) AS ranked_data ON d.dt = ranked_data.dt SET d.priority = ranked_data.row_num;
注意事项
- 如果
dt字段存在重复值,建议在窗口函数的排序规则中补充第二排序字段(比如表的主键ID),避免排序不稳定导致序号不符合预期,示例:ROW_NUMBER() OVER(ORDER BY dt ASC, id ASC) - 更新完成后可执行以下语句验证结果是否符合要求:
SELECT dt, priority FROM dotable WHERE DATE(dt) = CURDATE() ORDER BY dt ASC;
内容的提问来源于stack exchange,提问作者Edward Sheriff Curtis
相关产品推荐
相关产品推荐

