You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:按supplier_id取最高shipping_cost并求和的SQL查询问题

问题排查与代码修正

原代码存在的问题

  1. SQL查询逻辑错误:
    原SQL通过group by supplier_id分组后直接选取shipping_cost,无法保证拿到对应供应商的最高运费。在MySQL未开启ONLY_FULL_GROUP_BY模式时,会返回分组内任意一条记录的shipping_cost而非最大值,导致部分供应商的最高运费未被正确获取。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:37:49