我的数据库中有两个表,其中每个表中有两列,一个用于用户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
。所以请建议我如何解决这个问题。
答案 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
首先,我们需要获取 table1
或table2
中存在的所有用户ID的列表,以便我们可以将此列表用作数据集从LEFT OUTER JOIN
开始。从table1
或table2
开始加入的任何方法都不会削减它,因为如果所选表格不包含某些用户ID X,那么该用户将不会出现在最终结果中。< / p>
通过子选择创建userids
结果集我们LEFT JOIN
两个有趣的表格,以获得每个用户的分数。如果两个表中都没有用户,那么我们将为该用户获得NULL
分(因为NULL + number
提供NULL
),因此我们使用COALESCE
将NULL
转换为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