php - 从多个表中选择列的总和并按 id 分组

标签 php mysql sql

我有以下数据

购买记录

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

相关文章:

php - 如果以后的记录无法添加到 Laravel 5,如何回滚新记录?

php - 通过 FTP 添加新文件时运行 PHP 脚本

php - 为什么表达式 011 == 11 的计算结果为假?

php - phpmyadmin 中的存储过程

mysql - 不支持身份验证方法 'mysql_old_password'

sql - 帮助了解此 SQL 查询的语法

PHP imap_search UNSEEN SINCE 日期与时间

mysql:date + 1 在月份之间的交叉点不工作

PHP SQL : GROUP BY as array index

SQL Server STIntersects 查询返回误报