如何用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>
关键修改点说明
- SQL查询优化:使用
JOIN语法替代旧的多表逗号分隔写法,语义更清晰;添加字段别名避免重复字段名冲突。 - 数据预分组:将所有查询结果按客户ID存入数组,避免循环中嵌套查询,提升性能。
- 单元格合并:通过
rowspan属性,将同一客户的重复信息(客户ID、座位号等)单元格合并,仅显示一次,商品项逐行展示。 - 样式优化:添加基础CSS样式,区分客户信息行和商品行,提升表格可读性。
内容的提问来源于stack exchange,提问作者Kushal Chapagain
相关产品推荐
相关产品推荐

