MySQL 5.5.62中仅更新指定uID最新行的Date_alert字段
问题:更新MySQL指定用户的最新行字段值
环境与数据表
数据库环境:MySQL 5.5.62
数据表结构及数据如下:
| uID | Next_control | Next_control_2 | Date_alert |
|---|---|---|---|
| 45265 | 2023-09-07 | 2023-07-07 | NULL |
| 45265 | 2022-12-16 | 2022-10-16 | NULL |
| 45265 | 2019-04-19 | 2019-02-19 | NULL |
| 45265 | 2016-09-18 | 2016-07-18 | NULL |
| 45265 | 2014-11-23 | 2014-09-23 | NULL |
| 45265 | 2009-08-11 | 2009-06-11 | NULL |
需求
仅对uID为45265的最新一行数据(即Next_control值最大的行),将Date_alert字段更新为该行Next_control日期减去2个月。
尝试的SQL及问题
尝试执行以下SQL:
UPDATE `dotable` q JOIN (SELECT uID, MAX(Next_control) dt FROM `dotable` GROUP BY uID) t SET q.Date_alert = DATE_SUB( t.dt, INTERVAL 2 MONTH ) WHERE q.uID = t.uID;
执行后所有uID为45265的行Date_alert都被更新为同一值,不符合预期,期望仅最新一行的Date_alert为2023-07-07,其余行保持NULL。
修正后的SQL方案
方案一:JOIN时增加Next_control匹配条件
UPDATE `dotable` q JOIN ( SELECT uID, MAX(Next_control) AS max_dt FROM `dotable` WHERE uID = 45265 GROUP BY uID ) t ON q.uID = t.uID AND q.Next_control = t.max_dt SET q.Date_alert = DATE_SUB(q.Next_control, INTERVAL 2 MONTH);
说明:原SQL仅通过uID关联子查询结果,导致所有同uID的行都被更新。新增q.Next_control = t.max_dt条件后,仅匹配到uID为45265且Next_control为最大值的行,实现精准更新。
方案二:使用WHERE子查询筛选目标行
UPDATE `dotable` SET Date_alert = DATE_SUB(Next_control, INTERVAL 2 MONTH) WHERE uID = 45265 AND Next_control = ( SELECT MAX(Next_control) FROM `dotable` WHERE uID = 45265 );
说明:直接在WHERE条件中筛选出目标行(uID为45265且Next_control是该用户的最大值),然后执行更新,写法更简洁直观,适配MySQL 5.5版本。
内容的提问来源于stack exchange,提问作者George A. Custer
相关产品推荐
相关产品推荐

