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

如何用PHP和MySQL按订单分组展示同订单食品项并生成表格

按客户分组展示点餐订单的PHP实现方案

问题背景

正在参加黑客松,使用MySQL和PHP开发点餐系统,需要将客户订购的食品项按同一客户订单分组展示为表格。目前已通过关联查询获取customers、orders、products三张表的数据,但当前循环输出的表格不符合分组需求,需修改PHP循环逻辑实现分组展示。

数据表结构(XAMPP中)

  • 客户表(customers):包含字段id(客户ID)、seat_no(座位号)
  • 商品表(products):包含字段product_id(商品ID)、name(商品名称)
  • 订单表(orders):包含字段customer_id(关联客户ID)、product_id(关联商品ID)

当前代码问题

原代码直接逐行输出每条订单记录,导致同一客户的多条订单重复显示客户信息,无法实现分组合并的效果。

修改方案:按客户分组循环输出

核心思路:先通过SQL查询确保数据按客户ID排序,然后在PHP循环中跟踪当前客户ID,当客户ID变化时输出客户头部信息,同一客户的所有商品项合并展示客户相关单元格。

修改后的完整代码

<?php
include "connection.php";
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>客户订单分组展示</title>
  <style>
    table { border-collapse: collapse; width: 80%; margin: 20px auto; }
    th, td { border: 1px solid #ccc; padding: 8px; text-align: center; }
    th { background-color: #f2f2f2; }
    .customer-row td:first-child, .customer-row td:nth-child(2), .customer-row td:nth-child(4) {
      font-weight: bold;
    }
  </style>
</head>
<body>
    <table>
      <tr>
        <th>客户ID(客户表)</th>
        <th>客户ID(订单表)</th>
        <th>商品ID(商品表)</th>
        <th>座位号(客户表)</th>
        <th>商品名称(商品表)</th>
      </tr>
      <?php
      // 优化SQL查询,使用JOIN语法更清晰,同时确保按客户ID排序
      $selectquery = " 
        SELECT c.seat_no, c.id AS customer_id, o.customer_id AS order_customer_id, 
               o.product_id, p.product_id AS product_table_id, p.name AS product_name
        FROM customers c
        JOIN orders o ON c.id = o.customer_id
        JOIN products p ON p.product_id = o.product_id
        ORDER BY c.id
      ";

      $query = mysqli_query($con, $selectquery);
      
      $current_customer_id = null;
      $customer_product_list = [];

      // 先将所有数据按客户分组存入数组
      while ($result = mysqli_fetch_assoc($query)) {
          $customer_product_list[$result['customer_id']][] = $result;
      }

      // 遍历分组后的数组输出表格
      foreach ($customer_product_list as $customer_id => $products) {
          $product_count = count($products);
          $first_item = $products[0];
      ?>
        <tr class="customer-row">
          <td rowspan="<?php echo $product_count; ?>"><?php echo $first_item['customer_id']; ?></td>
          <td rowspan="<?php echo $product_count; ?>"><?php echo $first_item['order_customer_id']; ?></td>
          <td><?php echo $first_item['product_id']; ?></td>
          <td rowspan="<?php echo $product_count; ?>"><?php echo $first_item['seat_no']; ?></td>
          <td><?php echo $first_item['product_name']; ?></td>
        </tr>
        <?php
        // 输出当前客户的剩余商品项
        for ($i = 1; $i < $product_count; $i++) {
            $item = $products[$i];
        ?>
        <tr>
          <td><?php echo $item['product_id']; ?></td>
          <td><?php echo $item['product_name']; ?></td>
        </tr>
        <?php
        }
      }
      ?>
    </table>
</body>
</html>

关键修改点说明

  1. SQL查询优化:使用JOIN语法替代旧的多表逗号分隔写法,语义更清晰;添加字段别名避免重复字段名冲突。
  2. 数据预分组:将所有查询结果按客户ID存入数组,避免循环中嵌套查询,提升性能。
  3. 单元格合并:通过rowspan属性,将同一客户的重复信息(客户ID、座位号等)单元格合并,仅显示一次,商品项逐行展示。
  4. 样式优化:添加基础CSS样式,区分客户信息行和商品行,提升表格可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:01:08