如何从两个链接到第三个表的不同表中获取SUM

时间:2010-11-02 09:27:03

标签: sql mysql

好的问题是我必须从两个链接的表中总结两个总和

第一个表格点:

id | user_id | point | hit
1  | 1       |     4 | yes
2  | 1       |     2 | yes
3  | 1       |    -3 | no
4  | 1       |     4 | mb
5  | 2       |     2 | yes
6  | 2       |    -3 | no
7  | 2       |     4 | mb

秒表收入:

id | user_id | earning
1  | 1       |   5      
2  | 1       |   2     
3  | 1       |   3     
4  | 1       |   4     
5  | 2       |   2    
6  | 2       |   3    
7  | 2       |   4  

现在我试过的是这个:

SELECT 
    p.id, 
    SUM( SUM(p.point) + SUM(e.earning) ) AS bb 
FROM 
    points p LEFT JOIN earnings e ON p.user_id = e.user_id 
WHERE 
    (p.hit = "yes" OR p.hit = "no") 
GROUP BY 
    p.user_id

但我得错了结果

我想得到这个:

id | bb
1  | 17
2  | 8

谢谢!

6 个答案:

答案 0 :(得分:2)

如果您想要每位用户的总收入,您应该首先确定您希望获得收入的用户。最明智的选择可能是以用户表本身为基础。

SELECT user_id,
       (SELECT SUM(point)
          FROM points
         WHERE user_id = u.user_id
       )
       +
       (SELECT SUM(earning)
          FROM earnings
         WHERE user_id = u.user_id
           AND p.hit IN ('yes', 'no')
       ) AS bb
  FROM users

此方法的另一个好处是可以报告没有积分和/或收入的用户。

答案 1 :(得分:1)

可能是这样的:

select goals.user_id, sum(goal) as goal from
(select
  user_id, point as goal from points p where  (p.hit = "yes" OR p.hit = "no") 
union all
select
  user_id, earning as goal from earnings) goals
group by goals.user_id

答案 2 :(得分:0)

尝试更改此

SUM( SUM(p.point) + SUM(e.earning) )

SUM(p.point) + SUM(e.earning)

答案 3 :(得分:0)

尝试格式化bb字段,如下所示:

SUM(p.point + e.earning)

答案 4 :(得分:0)

对您的代码进行小修改...假设两个字段中的ID都不相关...并且您尝试选择用户ID而不是ID

SELECT p.user_id, SUM(p.point) + SUM(e.earning) AS bb 
FROM points p JOIN earnings e ON p.user_id = e.user_id 
WHERE (p.hit = "yes" OR p.hit = "no") 
GROUP BY p.user_id

答案 5 :(得分:0)

您查询的问题是,使用用户字段上的连接,您将获得多行...您必须执行总和然后将数据放在一起,除非您在点和之间有1-1关系收入表(如id)

解决方案可能是创建具有两个总和的表并将它们连接起来以获取数据

select COALESCE(P.user_id, E.user_id), points, earnings, 

总和(COALESCE(积分,0)+ COALESCE(收益,0))来自

(select user_id, sum(point) as points from points 

其中(p.hit =“是”或p.hit =“no”)group by user_id)为P

full outer join

(select user_id, sum(earning) as earnings from earnings group by user_id) as E
on P.user_id = E.user_id

group by COALESCE(P.user_id, E.user_id)

我使用FULL OUTER JOIN并合并以确保在缺少其中一个表的情况下提供数据。如果没有必要,你可以改变你的连接条件(例如,如果只有至少一个有效点需要数据,则为LEFT OUTER JOIN)