PHP结合MySQL多表内连接实现数据求和查询需求
实现按订单状态统计产品销售与供货总量的方案
没问题,我来帮你搞定这个统计需求!我们可以通过MySQL关联查询+分组聚合先拿到需要的数据,再用PHP把结果按要求格式输出,以下是具体实现步骤:
一、核心MySQL查询语句
首先我们需要关联三个表,按「产品名称+订单状态」分组,分别计算每个状态下的销售总量和供应商供货总量:
SELECT op.product_name, SUM(op.product_amount) AS total_sold, -- 如果supplier表中同一产品有多条记录,把下面的s.product_amount改成SUM(s.product_amount) s.product_amount AS total_supplied, o.order_status FROM order_products op -- 关联订单表,获取订单状态 JOIN orders o ON op.order_id = o.order_id -- 关联供应商表,获取供货总量 JOIN supplier s ON op.product_name = s.product_name -- 按产品和订单状态分组,确保每个状态下的产品单独统计 GROUP BY op.product_name, o.order_status -- 先按状态排序,让已发货/未发货的结果集中显示 ORDER BY o.order_status DESC, op.product_name;
关键说明:
- 若
supplier表存在同一产品的多条供货记录,记得把s.product_amount替换为SUM(s.product_amount),这样就能计算该产品的总供货量。 - 如果要兼容「无供应商数据的产品」,可以把
JOIN supplier改成LEFT JOIN supplier,同时用COALESCE(s.product_amount, 0)将NULL值替换为0,避免显示异常。
二、PHP代码实现示例
下面用PDO来实现数据库连接和结果输出,你也可以根据自己的开发环境换成mysqli:
<?php // 数据库连接配置 $host = 'localhost'; $dbname = 'your_database_name'; $username = 'your_db_username'; $password = 'your_db_password'; try { // 初始化PDO连接(开启异常模式方便调试) $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 执行统计查询 $sql = "SELECT op.product_name, SUM(op.product_amount) AS total_sold, s.product_amount AS total_supplied, o.order_status FROM order_products op JOIN orders o ON op.order_id = o.order_id JOIN supplier s ON op.product_name = s.product_name GROUP BY op.product_name, o.order_status ORDER BY o.order_status DESC, op.product_name"; $stmt = $pdo->prepare($sql); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); // 按订单状态分组整理结果,方便按要求格式输出 $groupedData = []; foreach ($results as $row) { $status = $row['order_status']; if (!isset($groupedData[$status])) { $groupedData[$status] = []; } $groupedData[$status][] = $row; } // 输出格式化后的统计结果 foreach ($groupedData as $status => $products) { echo "<strong>Product Name | Total Sold | Total Supplied | Order Status</strong><br>"; foreach ($products as $product) { echo "{$product['product_name']} | {$product['total_sold']} | {$product['total_supplied']} | {$status}<br>"; } echo "<br>"; } } catch(PDOException $e) { die("数据库操作失败: " . $e->getMessage()); } ?>
三、示例数据验证
用你提供的测试数据执行后,会得到符合预期的结果:
已发货(Shipped)部分:
Product Name | Total Sold | Total Supplied | Order Status
product 1 | 300 | 2500 | Shipped
未发货(Not_Shipped)部分:
Product Name | Total Sold | Total Supplied | Order Status
product 2 | 50 | 400 | Not_Shipped
product 3 | 10 | 600 | Not_Shipped
内容的提问来源于stack exchange,提问作者zontrakulla
相关产品推荐
相关产品推荐

