【问题标题】:Sum with inner join in PHP在 PHP 中使用内部连接求和
【发布时间】:2018-10-20 18:10:33
【问题描述】:

我正在使用 PHP 和 MySQL,我需要对加入 3 个表的产品总量求和:

order_products:(表中有多个订单商品同名但金额不同)

order_id        (int)
product_name    (varchar)
product_amount  (int)

订单:

order_id       (int)
order_date     (varchar)
order_status   (varchar)

供应商:

product_name    (varchar)
product_amount  (int)

所以,我想在一行中显示我售出的产品数量和发货状态,以及我从供应商那里订购的数量。以下两个示例中的任何一个都将帮助我实现目标。

喜欢:

Product Name     (sum order_products)      (sum supplier)  Order status

first product           300                  2500          Shipped_Only
second product          50                   400           Shipped_Only
third product           10                   600           Shipped_Only


Product Name     (sum order_products)      (sum supplier)  Order status

first product           2200                 2500          Not_Shipped
second product          400                  400           Not_Shipped
third product           590                  600           Not_Shipped

是否有任何示例或其他帮助我可以做到这一点?

编辑: 示例数据是这样的

order_products:

order_id       product_name     product_amount

255               product 1         200
256               product 1         100
257               product 2         50
258               product 3         10

订单: order_id order_date order_status

255               09.05.2018         Shipped
256               09.05.2018         Shipped
257               10.05.2018         Not_Shipped
258               10.05.2018         Not_Shipped

供应商: product_name product_amount

product 1         2500        
product 2         400   
product 3         600    

【问题讨论】:

  • 添加样本数据
  • @mickmackusa 编辑了我的问题以匹配所需的值
  • 我认为您的预期结果令人困惑。 257 和 258 没有发货,对吧?请说明您想要的输出。

标签: php mysql inner-join


【解决方案1】:

您应该在聚合子选择上使用连接。

SELECT t1.product_name, t1.sum_order_products, t2.supplier_sum, t1.order_status 
FROM (
    SELECT op.product_name, SUM(op.product_amount) sum_order_products, o.order_status
    FROM order_products op
    INNER JOIN orders o ON op.order_id = o.order_id 
    WHERE o.order_status = 'Shipped'
    GROUP BY op.product_name, o.order_status
) t1 
LEFT JOIN (
    SELECT s.product_name, SUM(s.product_amount) supplier_sum
    FROM supplier s 
    GROUP BY s.product_name
) t2 ON t1.product_name = t2.product_name 
ORDER BY t1.order_status, t1.product_name

【讨论】:

  • @mickmackusa 再次感谢 .. for op.sum .. 建议
  • @scaisEdge 我没有名为“sum_order_products”的表。这是我愿意得到的结果。请检查我的示例数据。
  • sum_order_products 是列别名而不是表名,并且此列别名由子选择产生...答案已使用 order_products 表更新
  • @mickmackusa 。感谢 sqlfiddle .. 答案已更新 .. 在某处投票非常感谢
  • @mickmackusa 什么是拖钓问题? ..(我没有找到 trolled 的翻译).. donwvotes 问题?
【解决方案2】:

据我了解,我认为这是您想要的,如果这不是您所期望的,请更清楚。

您将需要使用 GROUP BY 子句,并且您必须使用 count() 函数来计算来自 Group By 子句的结果的行数。我正在写一个如何使用 group by 子句的示例,您需要根据需要修改查询。

SELECT
 order_products.product_name,
 count(*) as Total_Orders,
 MAX(supplier.product_amount) as Supplier_Amt,
 orders.order_status
FROM supplier
 INNER JOIN order_products ON supplier.product_name = order_products.product_name
 INNER JOIN orders ON orders.order_id = order_products.order_id
WHERE orders.order_status = 'Not_Shipped'
GROUP BY order_products.product_name, orders.order_status;

您将需要查询,您可以编写另一个,只需将 WHERE orders.order_status = 'Not_Shipped' 替换为 WHERE orders.order_status = 'Shipped' 此外,如果您想在单个查询中进行所有操作,只需删除 where 子句。

【讨论】:

  • 尽管赞成,但没有结果集。玩一玩:sqlfiddle.com/#!9/eb76a0/2
  • 感谢您的回复,但结果不正确。检查@mickmackusa 提供的sqlfiddle。 Total_Supplier_Amt 翻倍,应该是 2500 而不是 5000
  • @Candy 您正在提供已发货和未发货行的混合结果集。我认为 OP 想要一种方式或其他方式。
  • 我认为 OP 想要的输出让我感到困惑。
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多