我的数据库中有两个表,每个表中有两列,一列用于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
解释
首先,我们需要获得
table1
或table2
中存在的所有用户id的列表,以便我们可以使用此列表作为数据集来执行LEFT OUTER JOIN
操作。任何从table1
或table2
开始连接的方法都不会剪切它,因为如果所选表不包含某些用户id X,则该用户根本不会出现在最终结果中。在通过子选择创建
userids
结果集之后,我们LEFT JOIN
两个有趣的表来获取每个用户的分数。如果两个表中都没有一个用户,那么这个用户的得分是NULL
(因为NULL + number
给出NULL
),所以我们使用COALESCE
将任何NULL
转换为0
。我应该注意,无论哪个用户包含(或不包含)在哪个表中,或表在查询中的显示顺序如何,此查询都将正常工作。