MySQL中使用SELECT查询结果批量更新同表符合条件行的写法是否正确?
问题解答
原SQL写法错误,无法实现预期效果
错误点
- 语句中的子查询
SELECT DATE_FORMAT(bdate, '%i') FROM newser会返回newser全表所有行的bdate分钟值,执行时会触发子查询返回行数超过1的报错;即使添加限制使子查询返回单行,取到的也不是当前待更新行对应的bdate值,不符合逐行取当前行字段计算相加的需求。 - 注意字段名对齐:需求中要更新的是
total_rating字段,示例中对应字段为total_result,实际执行前请确认实际表的字段名。
正确SQL写法
推荐方案(语义清晰,性能更优)
直接使用MySQL内置MINUTE()函数提取时间的分钟数值,无需子查询,直接引用当前行字段计算:
UPDATE newser SET total_rating = total_rating + MINUTE(`bdate`) WHERE bdate >= NOW() - INTERVAL 12 HOUR AND usertext = 'maxer12';
兼容DATE_FORMAT写法的方案
如果需要保留DATE_FORMAT用法,同样不需要子查询,直接引用当前行的bdate字段即可:
UPDATE newser SET total_rating = total_rating + DATE_FORMAT(`bdate`, '%i') WHERE bdate >= NOW() - INTERVAL 12 HOUR AND usertext = 'maxer12';
逻辑说明
两种写法均对匹配WHERE条件的每行数据,读取该行自身的bdate字段计算得到分钟值,再加到该行的total_rating字段上,完全符合预期的逐行相加效果。
内容的提问来源于stack exchange,提问作者Jarosław Król
相关产品推荐
相关产品推荐

