我的数据库中有两个表,每个表中有两列,一列用于userid,一列用于显示一些数字数据。
我只想添加数值列的值,但问题是这两个表都有相同的used 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不在第二个表中,所以请建议我如何解决这个问题。

最佳答案

通常,您可以通过执行完整的外部连接来解决此问题,但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,则该用户根本不会出现在最终结果中。
在通过子选择创建userids结果集之后,我们LEFT JOIN两个有趣的表来获取每个用户的分数。如果两个表中都没有一个用户,那么这个用户的得分是NULL(因为NULL + number给出NULL),所以我们使用COALESCE将任何NULL转换为0
我应该注意,无论哪个用户包含(或不包含)在哪个表中,或表在查询中的显示顺序如何,此查询都将正常工作。

10-04 22:05
查看更多