我有以下数据
购买记录
+----------+------------+----------------+
| user | date | total |
+----------+------------+----------------+
| 1510 | 2018-08-08 | 5 |
| 1510 | 2018-09-12 | 10 |
| 1510 | 2018-09-19 | 15 |
+----------+------------+----------------+
购买记录
+----------+------------+----------------+
| user | date | total |
+----------+------------+----------------+
| 1510 | 2018-05-08 | 10 |
| 1510 | 2018-07-02 | 15 |
+----------+------------+----------------+
我可以通过以下 sql LEFT JOIN 两个表
SELECT u.id, a.date, a.total AS total_a, b.date, b.total AS
total_b
FROM users AS u
LEFT JOIN purchase_rec_a AS a ON u.id = a.user
LEFT JOIN purchase_rec_b AS b ON u.id = b.user
WHERE u.id =1510
我得到以下信息
+-------+------------+---------+------------+---------+
| id | date | total_a | date | total_b |
+-------+------------+---------+------------+---------+
| 1510 | 2018-08-08 | 5 | 2018-05-08 | 10 |
| 1510 | 2018-08-08 | 5 | 2018-07-02 | 15 |
| 1510 | 2018-09-12 | 10 | 2018-05-08 | 10 |
| 1510 | 2018-09-12 | 10 | 2018-07-02 | 15 |
| 1510 | 2018-09-19 | 15 | 2018-05-08 | 10 |
| 1510 | 2018-09-19 | 15 | 2018-07-02 | 15 |
+-------+------------+---------+------------+---------+
所以我在这里尝试做的是按 total_a 和 total_b 以独特的方式对它们进行分组,然后按用户分组,所以我尝试了
SELECT u.id, a.date, SUM( a.total ) AS total_a,
b.date, SUM( b.total ) AS total_b
FROM users AS u
LEFT JOIN purchase_rec_a AS a ON u.id = a.user
LEFT JOIN purchase_rec_b AS b ON u.id = b.user
WHERE u.id =1510
结果是
+------+------------+---------+------------+---------+
| id | date | total_a | date | total_b |
+------+------------+---------+------------+---------+
| 1510 | 2018-08-08 | 60 | 2018-05-08 | 75 |
+------+------------+---------+------------+---------+
但这里的问题是一些数据是重复的,它们被添加为总数
我的预期结果如下
+------+------------+---------+------------+---------+
| id | date | total_a | date | total_b |
+------+------------+---------+------------+---------+
| 1510 | 2018-08-08 | 30 | 2018-05-08 | 25 |
+------+------------+---------+------------+---------+
我可以通过多个 SQL 得到上面的结果,但我想在单个 SQL 中得到它,这可能吗?
最佳答案
如果您想“并排”放置数据,我建议使用union all
和group by
:
select user, date, sum(a_total) as a_total, sum(b_total) as b_total
from ((select user, date, total as a_total, 0 as b_total
from purchase_rec_a
) union all
(select user, date, 0 as a_total, total as b_total
from purchase_rec_b
)
) ab
group by user, user_date;
如果你不想在结果中出现日期,你可以使用相同的结构,只是改变外部查询:
select user, sum(a_total) as a_total, sum(b_total) as b_total
from ((select user, date, total as a_total, 0 as b_total
from purchase_rec_a
) union all
(select user, date, 0 as a_total, total as b_total
from purchase_rec_b
)
) ab
group by user;
关于php - 从多个表中选择列的总和并按 id 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52553756/