2

我的数据库中有两个表,每个表中有两列,一列用于用户 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第二个表中不存在。所以请建议我如何解决这个问题。

4

3 回答 3

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

解释

首先,我们需要获取一个包含所有用户 ID 的列表,或者我们 可以使用这个列表作为数据集来执行操作。任何开始连接或不会切断连接的方法,因为如果所选表不包含某些用户 ID X,那么该用户将根本不会出现在最终结果中。table1table2LEFT OUTER JOINtable1table2

通过子选择创建userids结果集后,我们通过LEFT JOIN两个有趣的表来获取每个用户的分数。如果两个表中都不存在用户,那么我们将NULL为该用户获得分数(因为NULL + numberNULL),所以我们使用COALESCE将 any 转换NULL0.

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

于 2012-04-18T09:59:44.627 回答
4

不确定是否需要连接,只需要在外部查询中联合(所有)得分表和分组和总和

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 
于 2012-04-23T19:24:38.093 回答
0
SELECT SUM(table1.score1 + IS NULL(table2.score2) 
FROM table1 
LEFT JOIN table2 
ON table1=table1.id
于 2012-04-18T09:45:39.540 回答