求助:按supplier_id取最高shipping_cost并求和的SQL查询问题
问题排查与代码修正
原代码存在的问题
- SQL查询逻辑错误:
原SQL通过group by supplier_id分组后直接选取shipping_cost,无法保证拿到对应供应商的最高运费。在MySQL未开启ONLY_FULL_GROUP_BY模式时,会返回分组内任意一条记录的shipping_cost而非最大值,导致部分供应商的最高运费未被正确获取。 - PHP变量未初始化:
$total_shipping_cost未初始化为0,初始值为null,与数值相加时会出现非预期结果(比如仅保留第一个有效数值)。
修正方案
方案一:数据库层面直接计算总和(推荐,效率更高)
通过嵌套查询先获取每个供应商的最高运费,再直接求和:
<?php // 修正后的SQL:先分组取每个供应商的最高运费,再计算总和 $query = "SELECT SUM(max_shipping) AS total FROM ( SELECT MAX(shipping_cost) AS max_shipping FROM shipping WHERE order_id='37575000001' GROUP BY supplier_id ) AS sub_query"; $result = mysqli_query($conn, $query); $row = mysqli_fetch_array($result); // 处理无匹配数据的情况,默认总和为0 $total_shipping_cost = $row['total'] ?? 0; echo $total_shipping_cost; ?>
方案二:PHP层面求和(适合需要单独处理每个供应商最高运费的场景)
先修正SQL获取每个供应商的最高运费,再在PHP中循环求和:
<?php // 修正后的SQL:明确获取每个供应商的最高运费 $query = "SELECT MAX(shipping_cost) AS max_shipping FROM shipping WHERE order_id='37575000001' GROUP BY supplier_id"; $result = mysqli_query($conn, $query); $total_shipping_cost = 0; // 初始化总和变量为0 while($row = mysqli_fetch_array($result)) { $total_shipping_cost += $row['max_shipping']; } echo $total_shipping_cost; ?>
原代码输出40000的原因
原SQL未使用MAX()聚合函数,导致仅返回了supplier_id=2分组中的最高运费40000,而supplier_id=10分组返回的并非其最高值30000(或未被正确返回),最终求和结果仅为40000。
内容的提问来源于stack exchange,提问作者masbro
相关产品推荐
相关产品推荐

