【问题标题】:How to SUM column in MySQL left join如何在 MySQL 左连接中求和列
【发布时间】:2015-08-24 05:00:36
【问题描述】:

所以我有表cont_sales

---------------------------------
cont_selling_id   |     date    | 
---------------------------------
     1            | 2015-05-24  | 
     2            | 2015-06-06  | 
---------------------------------

表 02 cont_sold

   ----------------------------------------------------
    cont_sold_id |    cont_selling_id   |     price   | 
    ---------------------------------------------------
      1          |         1            |       10    | 
      2          |         1            |       10    | 
      3          |         1            |       30    | 
      4          |         2            |       20    | 
      5          |         2            |       10    | 
    --------------------------------------------------

和表03付款

 ----------------------------------------------
payment_id   |  cont_selling_id |      paid   | 
-----------------------------------------------
    1        |         1        |       10    | 
    2        |         2        |       10    | 
    3        |         1        |       20    | 
    4        |         1        |       10    | 
    5        |         2        |       10    | 
-----------------------------------------------

现在我需要基于 SELECT 表

现在我想根据 cont_salescont_sales_id 列合并所有这三个表

并且想求和 cont_sold 表价格列和支付表支付列

这就是我想做的事

期待输出

---------------------------------------------
cont_selling_id  |    price    |      paid   | 
---------------------------------------------
       1         |      50     |       40    | 
       2         |      30     |       20    | 
---------------------------------------------

所以我在 mysql 查询中尝试了这样的方法,但它给出了错误的总和结果

                    SELECT 

                    SUM(Z.price) as total, 
                    SUM(P.amount) as paid

                    FROM cont_selling S

                    LEFT JOIN cont_sold Z
                    ON S.cont_selling_id = Z.cont_selling_id

                    LEFT JOIN payment P
                    ON S.cont_selling_id = P.cont_selling_id    

                    GROUP BY S.cont_selling_id

对于上面的查询,我得到这样的输出

---------------------------------------------
cont_selling_id  |    price    |      paid   | 
---------------------------------------------
       1         |      150    |       40    | 
       2         |      60     |      120    | 
---------------------------------------------

【问题讨论】:

  • 你能显示你得到的结果吗?
  • @Jens 我已经用这个问题添加了我的输出。请检查一下,谢谢

标签: mysql


【解决方案1】:

这个未经测试的查询应该可以工作:

with a as(select  cont_selling_id  , sum(price) as totalprice from cont_sold group by cont_selling_id),
with a as(select  cont_selling_id  , sum(paid) as totalpaid from payment group by cont_selling_id),
select c.cont_selling_id , totalprice, totalpaid from cont_selling c left join a.count_selling_id = c.count_selling_id
left join b.count_selling_id = c.count_selling_id

您必须创建临时表,因为您的表在价格和支付之间没有依赖关系。

【讨论】:

    【解决方案2】:

    您应该使用SUM 进行两个不同的查询,然后将它们组合起来以获得所需的结果:

    SELECT T1.cont_selling_id,T1.price,T2.paid
    FROM
    (SELECT c.cont_selling_id,SUM(cs.price) as price
     FROM cont_selling c LEFT JOIN
         cont_sold cs ON c.cont_selling_id=cs.cont_selling_id
     GROUP BY c.cont_selling_id) as T1 JOIN
    (SELECT c.cont_selling_id,SUM(p.paid) as paid
     FROM cont_selling c LEFT JOIN
          payment p ON p.cont_selling_id=c.cont_selling_id
      GROUP BY c.cont_selling_id) as T2 ON T1.cont_selling_id=T2.cont_selling_id
    

    结果:

    cont_selling_id price   paid
    ----------------------------
    1               50      40
    2               30      20
    

    SQL Fiddle 中的示例结果。

    【讨论】:

      【解决方案3】:

      这里你可以如何使用 aggegare 部分到内部查询然后加入

      select 
      cs.cont_selling_id,
      price,
      paid
      from cont_selling cs
      left join(
       select sum(price) as price , cont_selling_id from cont_sold
       group by cont_selling_id
      )x on x.cont_selling_id = cs.cont_selling_id,
      left join(
       select sum(paid) as paid , cont_selling_id from payment
       group by cont_selling_id
      )y
      on y.cont_selling_id = cs.cont_selling_id; 
      

      【讨论】:

      • 这个查询很简单而且很棒... :D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多