在使用第三个表连接两个表时计算记录的总和

时间:2017-10-02 19:19:36

标签: 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)。我怎样才能有正确的数字?

3 个答案:

答案 0 :(得分:3)

您应该加入汇总结果而不是原始表

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

答案 1 :(得分:2)

你可以尝试下面的

select bx.id, recieved, sum(c.sent) sent from
(
SELECT a.id, sum(b.received) recieved
from a 
INNER JOIN b 
ON a.id=b.uid
group by a.id
) bx
INNER JOIN c 
ON c.uid=bx.id 
group by bx.id, bx.recieved;

<强> >>>Demo<<<

答案 2 :(得分:0)

这摆脱了子查询,但引入了一些你可能不想要的东西:

( SELECT  uid, 'Received' AS direction, SUM(received) AS HowMany
      WHERE  uid = 1
      GROUP BY uid )
UNION ALL
( SELECT  uid, 'Sent' AS direction, SUM(sent) AS HowMany
      WHERE  uid = 1
      GROUP BY uid )