MySQL 中按商品编号聚合统计并用 PHP 输出表格的完整教程

2次阅读

MySQL 中按商品编号聚合统计并用 PHP 输出表格的完整教程

本文详解如何使用 mysql 的 group by 与聚合函数(sum、count)对订单数据按商品编号进行汇总,并通过安全、高效的 php 代码将结果渲染为 html 表格,避免 n+1 查询陷阱与 sql 注入风险。

本文详解如何使用 mysql 的 group by 与聚合函数(sum、count)对订单数据按商品编号进行汇总,并通过安全、高效的 php 代码将结果渲染为 html 表格,避免 n+1 查询陷阱与 sql 注入风险。

在电商或进销存系统中,常需将原始订单明细(如多条同商品记录)按商品编号(product_number)归并:统计总数量(SUM(quantity))、汇总总金额(SUM(amount)),并关联商品描述(如从 products 表获取)。原始代码存在严重性能与逻辑缺陷——它在循环中嵌套执行三次查询(N+1 问题),且每次 GROUP BY 查询都返回全部分组结果,导致只取首行、数据错位、金额重复(如恒为 $24.05),根本无法实现预期聚合效果。

✅ 正确方案应遵循「一次查询完成聚合 + 一次关联补全信息」原则。假设数据库结构如下:

  • orders 表:含 date, product_number, quantity, amount 字段
  • products 表:含 product_number, description 等字段

推荐使用 单条 JOIN + GROUP BY 查询,高效且语义清晰:

SELECT    o.product_number AS 'Prod Num',   p.description AS 'Description',   SUM(o.quantity) AS 'Count',   CONCAT('$ ', ROUND(SUM(o.amount), 2)) AS 'Total Amount' FROM orders o INNER JOIN products p ON o.product_number = p.product_number GROUP BY o.product_number, p.description;

该查询直接返回聚合后的三列关键数据,并通过 CONCAT 格式化金额为带 $ 符号的字符串,同时确保商品描述准确关联。

立即学习PHP免费学习笔记(深入)”;

在 PHP 中安全执行此查询(务必使用预处理语句防止 SQL 注入):

<?php // 假设 $dbc 是已建立的 mysqli 连接 $query = "SELECT              o.product_number AS 'Prod Num',             p.description AS 'Description',             SUM(o.quantity) AS 'Count',             CONCAT('$ ', ROUND(SUM(o.amount), 2)) AS 'Total Amount'           FROM orders o           INNER JOIN products p ON o.product_number = p.product_number           GROUP BY o.product_number, p.description";  $result = mysqli_query($dbc, $query);  if (!$result) {     die("Query failed: " . mysqli_error($dbc)); }  echo '<table class="s-table">'; echo '<thead><tr><th>Prod Num</th><th>Description</th><th>Count</th><th>Total Amount</th></tr></thead>'; echo '<tbody>';  while ($row = mysqli_fetch_assoc($result)) {     echo "<tr>             <td>{$row['Prod Num']}</td>             <td>{$row['Description']}</td>             <td>{$row['Count']}</td>             <td>{$row['Total Amount']}</td>           </tr>"; }  echo '</tbody></table>'; ?>

? 关键注意事项:

  • 禁止在循环内执行 SQL 查询:原始代码中 while(…){ $query2; $query3; } 导致每行数据触发多次数据库往返,时间复杂度 O(n²),数据量增大时必然崩溃;
  • 显式指定 GROUP BY 字段:若 products 表中 description 与 product_number 非严格一一对应(如存在同编号多描述),需确认业务主键逻辑,否则应仅 GROUP BY o.product_number 并用子查询或窗口函数处理描述;
  • 金额精度处理:ROUND(SUM(o.amount), 2) 确保货币显示两位小数,避免浮点误差;CONCAT 比 PHP 字符串拼接更可靠;
  • 错误处理不可省略:始终检查 mysqli_query() 返回值,便于快速定位语法或权限问题;
  • 考虑使用 pdo:如需更高安全性与跨库兼容性,建议迁移至 PDO 并启用 PDO::ATTR_EMULATE_PREPARES = false。

通过以上优化,您将获得稳定、可扩展、符合 Web 开发最佳实践的数据聚合与展示能力——既精准输出如 308306 | BROWNIE… | 15 | $473.10 的预期结果,又为后续添加分页、搜索、导出等功能奠定坚实基础。

text=ZqhQzanResources