Laravel转MySQL查询结果异常,请求正确SQL转换方案
正确的MySQL语句转换方案
原Laravel代码逻辑
这段Laravel代码的作用是:根据matricula找到唯一一条viaturas记录,将该记录的total_viaverde字段值,加上当前$viaverde对象对应的custo值,完成更新。
原代码:
$viaturas = Viaturas::firstWhere('matricula', $viaverde->matricula); $viaturas->total_viaverde = $viaverde->custo + $viaturas->total_viaverde; $viaturas->update();
你的SQL问题分析
你编写的SQL存在两个核心问题:
- 使用
SUM(viaverde.custo)会计算所有关联matricula的viaverde记录的custo总和,而非仅累加当前单条viaverde的custo值 - 未添加限定条件,若某个
matricula对应多条viaverde记录,会导致viaturas的total_viaverde被重复更新,结果完全偏离预期
正确的MySQL语句
根据原Laravel的单条累加逻辑,提供两种对应实现:
方式1:直接指定数值更新(最贴合Laravel逻辑)
如果已知要累加的custo值和目标matricula,直接执行:
UPDATE `viaturas` SET `total_viaverde` = `total_viaverde` + [替换为实际custo数值] WHERE `matricula` = '[替换为实际matricula值]';
方式2:关联viaverde表更新
如果需要通过关联viaverde表获取要累加的数值,需添加条件确保仅针对单条viaverde记录(比如通过viaverde的主键id):
UPDATE `viaturas` INNER JOIN `viaverde` ON `viaturas`.`matricula` = `viaverde`.`matricula` SET `viaturas`.`total_viaverde` = `viaturas`.`total_viaverde` + `viaverde`.`custo` WHERE `viaverde`.`id` = [替换为目标viaverde记录的ID];
额外场景:批量累加所有关联viaverde的总和
如果你的实际需求是给每个viaturas记录累加其所有关联viaverde的custo总和,可使用以下语句:
UPDATE `viaturas` INNER JOIN ( SELECT `matricula`, SUM(`custo`) AS `total_custo` FROM `viaverde` GROUP BY `matricula` ) AS `viaverde_totals` ON `viaturas`.`matricula` = `viaverde_totals`.`matricula` SET `viaturas`.`total_viaverde` = `viaturas`.`total_viaverde` + `viaverde_totals`.`total_custo`;
内容的提问来源于stack exchange,提问作者Petruquio
相关产品推荐
相关产品推荐

