2015-04-05 55 views
0

这是tbl_user:SUM MySQL表的多个列的

----------------- 
ID | Username 
----------------- 
1  user one 
2  user two 

这是tbl_x1:

------------------------- 
ID | User_id | Sum 
------------------------- 
1  1   10 
2  1   20 
3  2   30 

这是tbl_x2:

------------------------- 
ID | User_id | Sum 
------------------------- 
1  1   10 
2  1   20 
3  1   30 

这是tbl_y:

------------------------- 
ID | User_id | Days 
------------------------- 
1  1   10 

我想选择sum(x1.sum + x2.sum)和sum(y.Days)。
换句话说,我想以下结果:

------------------------------------- 
ID | Username | Sum | Days 
------------------------------------- 
1  user one  90  10 
2  user two  30  0 

我这个代码的尝试:

select u.id as ID, u.username as Username, sum(y.days) as Days,(ifnull(sum(x1.sum), 0) + ifnull(sum(x2.sum), 0)) as Sum from tbl_user u left join tbl_x1 x1 on u.id = x1.user_id left join tbl_x2 g on u.id = x2.user_id left join tbl_y y on u.id = y.user_id group by u.id 

,但我得到错误的结果。

+0

而问题是什么?你卡在哪里?你有错误吗? – 2015-04-05 12:58:26

+0

该查询不起作用。 – Garme 2015-04-05 13:17:58

回答

1

问题是,对于给定的user_idjoin操作会使行倍增。通过乘以行(称为“笛卡尔乘积”),您会得到错误的总和。

解决的办法是做聚合之前做连接:

select u.id as ID, u.username as Username, y.days, 
     coalesce(x1.sum, 0) + coalesce(x2.sum, 0)) as Sum 
from tbl_user u left join 
    (select x1.user_id, sum(x1.sum) as sum 
     from tbl_x1 x1 
     group by x1.user_id 
    ) x1 
    on u.id = x1.user_id left join 
    (select x2.user_id, sum(x.sum) as sum 
     from tbl_x2 x2 
     group by x2.user_id 
    ) x2 
    on u.id = x2.user_id left join 
    (select y.user_id, sum(y2.days) as days 
     from tbl_y y 
     group by y.user_id 
    ) y 
    on u.id = y.user_id; 
+0

在加入多个表的情况下,通过将总和除以重复值的重复次数,可以得到与简单连接相同的结果!? – jfun 2015-04-05 13:40:23

+0

现在,我想写一个声明。例如:(WHERE sum - days <10)但错误。正确的方法是什么? – Garme 2015-04-05 15:53:11

+0

@Farhęg。 。 。这可能适用于一个连接,但有多个连接会变得相当复杂。 – 2015-04-05 20:52:53