【发布时间】:2020-01-27 14:27:58
【问题描述】:
关于这个问题 (How to get the sum in a joined table when using group by - getting wrong results) 我有两个表 orders 和 order_items。我需要按天对结果进行分组。但我还需要从另一个表中获取每天的energy_used 的总和。当我尝试使用连接时,我每天都会出错order_sum(它们没有被总结)。不知道我做错了什么。
我想每天都得到
- 当天创建的所有订单的
order_items.energy_used总和 - 当天创建的所有订单的
orders.order_sum总和 - 对应于当天创建的最新
order的created_at和order_sum
这是我的orders 表
+----+-----------+---------+---------------------+
| id | order_sum | user_id | created_at |
+----+-----------+---------+---------------------+
| 1 | 25.13 | 7 | 2020-01-25 09:13:00 |
| 2 | 10.00 | 7 | 2020-01-25 15:23:00 |
| 3 | 14.00 | 5 | 2020-01-26 10:14:00 |
| 4 | 35.00 | 1 | 2020-01-27 11:13:00 |
+----+-----------+---------+---------------------+
这是我的order_items 表
+----+----------+-------------+---------------------+
| id | order_id | energy_used | created_at |
+----+----------+-------------+---------------------+
| 1 | 1 | 65 | 2020-01-25 09:13:00 |
| 2 | 1 | 12 | 2020-01-25 09:13:00 |
| 3 | 2 | 70 | 2020-01-26 10:14:00 |
| 4 | 2 | 5 | 2020-01-26 10:14:00 |
| 5 | 3 | 0 | 2020-01-27 11:13:00 |
+----+----------+-------------+---------------------+
这是我想要达到的理想结果
+---------------+-----------------+-------------------+---------------------+----------------+
| date_of_month | total_order_sum | total_energy_used | last_order_date | last_order_sum |
+---------------+-----------------+-------------------+---------------------+----------------+
| 2020-01-25 | 35.13 | 77 | 2020-01-25 09:13:00 | 25.13 |
| 2020-01-26 | 14.00 | 75 | 2020-01-26 10:14:00 | 14.00 |
| 2020-01-27 | 35.00 | 0 | 2020-01-27 11:13:00 | 35.00 |
+---------------+-----------------+-------------------+---------------------+----------------+
这是我尝试过的查询,但我得到了错误的结果,order_sum 的计算不正确。它与last_order_sum显示相同
select
date(o.created_at) date_of_month,
i.total_energy_used,
o.created_at last_order_date,
o.order_sum last_order_sum,
sum(order_sum) as total_order_sum
from orders o
inner join (
select date(o1.created_at) date_of_month, sum(i1.energy_used) total_energy_used
from orders o1
inner join order_items i1 on o1.id = i1.order_id
group by date(o1.created_at)
) i on i.date_of_month = date(o.created_at)
where o.created_at = (
select max(o1.created_at)
from orders o1
where date(o1.created_at) = date(o.created_at)
)
这是一个小提琴: https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=92b8cc2920ad9f7a7cdd56bded5a3bf2
【问题讨论】:
-
那么,
created_at算不算下单日期?这适用于orders.created_at和order_items.created_at? -
@ThorstenKettner 是的,这是正确的
-
如果要分组,为什么不用
GROUP BY? -
您使用的是什么版本的 MySQL? (获取 last_order_sum 可能有点棘手,使用 MySQL 8 比以前的版本更容易解决。)
-
@ThorstenKettner 我正在使用 5.5