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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:06