添加来自不同表的每个行值

时间:2017-01-10 03:57:26

标签: php mysql

问题: 3个表:tbl_product,tbl_soldproducts,tbl_purchasedetail tbl_product有一个prod_no的主键,它是每个2表上的外键。 tbl_products tbl_products tbl_purchasedetail tbl_purchasedetail tbl_soldproducts tbl_soldproducts

在tbl_soldproducts中,我有列item_sold描述每个交易为此产品销售的商品数量。 在tbl_purchasedetail中,我有qty_purchase,它描述了每笔交易的商品购买数量。 我需要计算每件商品的销售和购买总数。 出口输出:

Prod no | item_sold |qty_purchase | left
   1    |    23     |     25      |  2
   2    |    1      |     10      |  9

我当前显示错误输出的代码:

   SELECT TP.prod_no,TP.barcode,TP.prod_name, COUNT(TS.qty) as num_sold,
   COUNT(TPS.qty_delivered) as num_delivered
   FROM tbl_product AS TP 
   LEFT JOIN tbl_soldproducts AS TS
   on (TS.prod_no = TP.prod_no)
   LEFT JOIN tbl_purchasedetail AS TPS
   on (TPS.prod_no = TP.prod_no)
   group by TS.prod_no
   ORDER BY TP.prod_name

2 个答案:

答案 0 :(得分:1)

您从未向我们展示任何示例数据,但我认为您应该在单独的子查询中聚合两个辅助表,然后将这些结果加回tbl_product。这样的事情应该有效:

SELECT TP.prod_no,
       TP.barcode,
       TP.prod_name,
       COALESCE(TS.num_sold, 0) AS num_sold,
       COALESCE(TPS.num_delivered, 0) AS num_delivered
FROM tbl_product TP
LEFT JOIN
(
    SELECT prod_no, COUNT(*) AS num_sold
    FROM tbl_soldproducts
    GROUP BY prod_no
) TS
    ON TP.prod_no = TS.prod_no
LEFT JOIN
(
    SELECT prod_no, COUNT(*) AS num_delivered
    FROM tbl_purchasedetail
    GROUP BY prod_no
) TPS
    ON TP.prod_no = TPS.prod_no
ORDER BY TP.prod_name

如果您要从tbl_product中选择的只是产品编号,那么原始查询可能没问题。但是您的查询可能会有奇怪的行为,因为您在使用tbl_product时从GROUP BY选择非聚合列。如果你想选择其他列,你应该采用我建议的方法。

答案 1 :(得分:0)

你最好给我们一个数据库案例。 @Tim Biegeleisen那是对的