2016-02-20 34 views
-2

please click to see the image to help make query如何在mysql中优化这三个表查询?

customer 
cus_ID name 
1  jon 
2  maik 

order 
rec_ID cus_ID amount 
1   1  100 
2   1  100 
3   1  100 
4   1  100 
5   2  150 
6   2  50 

payment 
pay_ID cus_ID amount 
1   1 100 
2   1 100 
3   1 50 
4   2 50 

OUTPUT Need 

name order_amount pay_amount 
jon   400   250 
maik  200   50 

这是我的三个表我如何在MySQL查询获取输出。我会尝试这个代码

SELECT c.name 
    , SUM(o.amount) oamount 
    , SUM(p.amount) pamount 
    FROM customer c 
    JOIN `order` o 
    ON o.cus_ID = c.cus_ID 
    JOIN payment p 
    ON p.cus_ID = c.cus_ID 
GROUP 
    BY c.cus_ID 

但不会让完美的结果,请帮忙解决了这个

+0

请在您的问题中包含必要的代码,DDL,样本数据。图片并不真的帮助 – baao

+0

我插入示例数据后,如果可能请帮助解决此查询 – nazmul

+0

@mmm,我同意不使用图像,但作为新手,他们将学习...另外,Nazmul,点击帮助 - >现场礼仪游览,以帮助您在未来。 – DRapp

回答

2

因为你正在做的所有的客户,并防止虚假笛卡尔产品具有比其他每个订单更多记录一个表/付款表,请仅根据客户ID分别创建与SUBQUERIES的联接。

我已经完成了对子查询的左连接只是在情况下有条目,其中没有付款或没有订单阻止记录被包括在内。由于每个客户记录将只有一个,并且由于底层子查询也按客户ID分组,所以不需要最后一个组,因为每个子查询最多会有一条记录,并且永远不会产生笛卡尔组。

SELECT 
     customer.name, 
     COALESCE(sumOrder.TotalOrders, 0) AS oamount, 
     COALESCE(sumPay.TotalPay, 0) AS pamount 
    FROM 
     customer 
     LEFT JOIN 
     (select o.cus_id, 
        sum(o.amount) as TotalOrders 
       from 
       order o 
       group by 
       o.cus_id) sumOrder 
      ON customer.cus_ID = sumOrder.cus_ID 
     LEFT JOIN 
     (select p.cus_id, 
        sum(p.amount) as TotalPay 
       from 
       payment p 
       group by 
       p.cus_id) sumPay 
      ON customer.cus_ID = sumPay.cus_ID 
+0

谢谢DRapp,它的工作 – nazmul

+0

@nazmul,太棒了......作为一个新手,看看帮助 - >游览网站礼仪和标记问题解决,让其他人知道什么工作寻找类似的问题,或仍然需要其他答案。 – DRapp