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

如何对MySQL商品表按名称汇总统计并输出正确结果?

MySQL按商品名称汇总统计的PHP实现问题

我有一个结构如下的MySQL products 表:

idnamequantityprice
1milk33.5
2jam21.45
3jam11.45
4milk63.5

我需要按商品名称汇总的统计结果,期望输出如下:

milk - quantity: 9 - price: 3.5 - Sum: 31.5
jam - quantity: 3 - price: 1.45 - Sum: 4.35

但目前我的PHP代码输出的是逐条记录的结果(不是汇总的):

milk - quantity: 3 - price: 3.5 - Sum: 10.5
jam- quantity: 2 - price: 1.45 - Sum: 2.9
jam - quantity: 1 - price: 3.5 - Sum: 1.45
milk - quantity: 6 - price: 3.5 - Sum: 21

我当前使用的PHP代码如下:

$conn=mysqli_connect('localhost','root','','shop') or die ("Fail");
$sql="select * from products";
$result=mysqli_query($conn, $sql);
while ($role=mysqli_fetch_array($result)){
 extract ($role);
 if ($quantity>0) {
 echo " $name - Price: $price - Quantity: $quantity - Sum is: ".round($quantity*$price,2)."<br>";
 } else {
 $m[$i]="$name - Price: $price <br>";
 $i++;
 }
}

请帮忙解决这个问题,谢谢!


解决方案

有两种常见的实现方式,一种是让MySQL直接帮你完成汇总(更高效,推荐),另一种是在PHP代码中手动处理数据完成汇总。

方式一:使用MySQL聚合查询(推荐)

直接修改SQL语句,用GROUP BY按商品名称分组,同时用SUM()计算总数量和总金额,MAX()/MIN()获取单价(假设同商品单价一致):

$conn = mysqli_connect('localhost','root','','shop') or die ("Fail");
// 聚合查询:分组计算总数量、总金额,获取单价
$sql = "SELECT 
            name, 
            SUM(quantity) AS total_quantity, 
            price, 
            SUM(quantity * price) AS total_sum 
        FROM products 
        WHERE quantity > 0 
        GROUP BY name, price"; // 因为同商品价格一致,所以可以和name一起分组

$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    // 格式化输出,保留两位小数
    echo "{$row['name']} - quantity: {$row['total_quantity']} - price: {$row['price']} - Sum: " . round($row['total_sum'], 2) . "<br>";
}

这种方式的优势是数据库直接完成计算,减少PHP的内存消耗,尤其是数据量大的时候更明显。

方式二:PHP代码中手动汇总

如果因为某些原因不能修改SQL,也可以在PHP中遍历数据时用数组存储每个商品的汇总信息:

$conn = mysqli_connect('localhost','root','','shop') or die ("Fail");
$sql = "select * from products";
$result = mysqli_query($conn, $sql);

// 用数组存储每个商品的汇总数据
$summary = [];

while ($row = mysqli_fetch_assoc($result)) {
    $name = $row['name'];
    $quantity = $row['quantity'];
    $price = $row['price'];
    
    if ($quantity <= 0) {
        continue; // 跳过数量为0的记录
    }
    
    // 如果商品还没在汇总数组里,初始化数据
    if (!isset($summary[$name])) {
        $summary[$name] = [
            'total_quantity' => 0,
            'price' => $price,
            'total_sum' => 0
        ];
    }
    
    // 累加数量和总金额
    $summary[$name]['total_quantity'] += $quantity;
    $summary[$name]['total_sum'] += $quantity * $price;
}

// 遍历汇总数组输出结果
foreach ($summary as $name => $data) {
    echo "{$name} - quantity: {$data['total_quantity']} - price: {$data['price']} - Sum: " . round($data['total_sum'], 2) . "<br>";
}

注意事项

  • 确保同一种商品的price字段值是一致的,如果存在同商品不同价格的情况,你需要考虑如何处理(比如取平均价格,或者分开统计)。
  • 建议使用mysqli_fetch_assoc()代替mysqli_fetch_array(),这样可以通过字段名访问数据,代码可读性更好。
  • 避免使用extract()函数,它会把数组键名变成变量,容易引发变量冲突,降低代码可维护性。

内容的提问来源于stack exchange,提问作者copy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:42:39