如何汇总两个不同表的两个不同列的数据?

时间:2012-04-18 09:40:06

标签: mysql sum aggregate-functions

我的数据库中有两个表,其中每个表中有两列,一个用于用户ID和一个用于显示一些数字数据。

我只想添加数字列的值,但问题是表格并非强制要求表格具有相同的使用ID。

我将尝试使用示例解释它:

table1

userid  score1

  1       200
  2       300


table2

userid  score2

  1       400

所以现在我要做的是根据用户ID将这两个表的得分相加并将其显示在这样的新表中:

userid  score_sum

  1       600
  2       300

如果我只是使用

Select sum(table1.score1+table2.score2) 
FROM table1 JOIN table2 ON table1.id=table2.id

然后它只显示userid 1的总和,因为第二个表中没有userid 2。所以请建议我如何解决这个问题。

3 个答案:

答案 0 :(得分:4)

通常你会通过执行完全外连接来解决这个问题,但是MySql不支持这样的连接,所以它需要伪造。

查询

SELECT SUM(COALESCE(table1.score1,0) + COALESCE(table2.score2,0))
FROM (
    SELECT DISTINCT(id) FROM (
        SELECT userid FROM table1 UNION SELECT userid FROM table2
    ) tmp
) userids
LEFT JOIN table2 ON table2.userid = userids.userid
LEFT JOIN table1 ON table1.userid = userids.userid
GROUP BY table1.userid

说明

首先,我们需要获取 table1table2中存在的所有用户ID的列表,以便我们可以将此列表用作数据集从LEFT OUTER JOIN开始。从table1table2开始加入的任何方法都不会削减它,因为如果所选表格不包含某些用户ID X,那么该用户将不会出现在最终结果中。< / p>

通过子选择创建userids结果集我们LEFT JOIN两个有趣的表格,以获得每个用户的分数。如果两个表中都没有用户,那么我们将为该用户获得NULL分(因为NULL + number提供NULL),因此我们使用COALESCENULL转换为0

我应该注意,无论在哪个表中包含(或不包含)哪个用户,或者表在查询中出现的顺序,此查询都将正常工作。

答案 1 :(得分:4)

不确定是否需要加入,只需要联合(所有)得分表和组&amp;外部查询中的总和

SELECT userid, SUM(score)
FROM ( 
    SELECT userid, score1 as score FROM table1 
    UNION ALL SELECT userid, score2 as score FROM table2
) t 
GROUP BY t.userid 

答案 2 :(得分:0)

SELECT SUM(table1.score1 + IS NULL(table2.score2) 
FROM table1 
LEFT JOIN table2 
ON table1=table1.id