如何对MySQL商品表按名称汇总统计并输出正确结果?
MySQL按商品名称汇总统计的PHP实现问题
我有一个结构如下的MySQL products 表:
| id | name | quantity | price |
|---|---|---|---|
| 1 | milk | 3 | 3.5 |
| 2 | jam | 2 | 1.45 |
| 3 | jam | 1 | 1.45 |
| 4 | milk | 6 | 3.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
相关产品推荐
相关产品推荐

