mysql - 在将两个表与第三个表连接时计算记录的总和

标签 mysql sql query-optimization

我有三个表:

mysql> select * from a;
+----+---------+
| ID | Name    |
+----+---------+
|  1 | John    |
|  2 | Alice   |
+----+---------+

mysql> select * from b;
+------+------------+----------+
| UID  | date       | received |
+------+------------+----------+
|    1 | 2017-10-02 |        5 |
|    1 | 2017-09-30 |        1 |
|    1 | 2017-09-29 |        4 |
+------+------------+----------+

mysql> select * from c;
+------+------------+------+
| UID  | date       | sent |
+------+------------+------+
|    1 | 2017-09-25 |    7 |
|    1 | 2017-09-30 |    2 |
|    1 | 2017-09-29 |    3 |
+------+------------+------+

如果我尝试计算发送给 John 的总数,则为 12。接收的则为 10。 但是如果我尝试连接所有三个表,结果很奇怪。这是我连接三个表的查询:

mysql> select sum(sent), sum(received) from a
    -> join c on c.UID = a.ID
    -> join b on b.UID = a.ID
    -> where a.ID = 1;
+-----------+---------------+
| sum(sent) | sum(received) |
+-----------+---------------+
|        36 |            30 |
+-----------+---------------+

但我需要正确的数字(分别是 12 和 10)。我怎样才能得到正确的数字?

最佳答案

你应该加入聚合结果而不是原始表

select a.uid, t1.received, t2.sent
from a
inner join (
    select uid, sum(received) received
    from b 
    group by uid
    ) t1 on t1.uid = a.id
inner join (
    select uid, sum(sent) sent
    from c 
    group by uid
    ) t2 on t2.uid = a.id
 where a.id = 1

关于mysql - 在将两个表与第三个表连接时计算记录的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532270/

相关文章:

sql - 游标和 View 有什么区别?

sql - 为什么不喜欢 SQL?

sql-server - SQL查询成本计算,聚合 View 更快?

php - 每个数据库列一个ID,怎么办?

php - 为什么我无法获取搜索结果?

java - 维护以前搜索的历史记录

sql - 连接多个公用表表达式

PHP MySQL报表查询优化

mysql - 什么模式只匹配相同的数字(1111)并排除差异数字(1234)?

java - 映射 Java 持久性中的附加字段