简体   繁体   中英

Calculate sum on the records while joining two tables with a third table

I have three tables:

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 |
+------+------------+------+

If I try to calculate the total number of sent for John, it would be 12. And for received, it would be 10. But if I try to join all three tables, the result is weird. Here is my query to join three tables:

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 |
+-----------+---------------+

But I need correct numbers (12 and 10, respectively). How can I have correct numbers?

You should join the aggregated result and not the raw tables

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

You could try below

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<<<

This gets rid of the subquery, but introduces something else you might not want:

( 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 )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM