Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用具有内部联接的group by时获取错误的和_Mysql_Sql_Database - Fatal编程技术网

Mysql 使用具有内部联接的group by时获取错误的和

Mysql 使用具有内部联接的group by时获取错误的和,mysql,sql,database,Mysql,Sql,Database,关于这个问题(),我有两个表orders和order\u items。我需要按天对结果进行分组。但是我还需要从另一个表中获得每天使用的能量的总和。当我尝试使用联接时,每天的顺序都会出错(它们没有被求和)。不知道我做错了什么 我希望每天都能得到 当天创建的所有订单使用的order\u项目的总和 订单的总和。当天创建的所有订单的订单总和 在创建的和订单金额,对应于当天创建的最新订单 这是我的订单表格 +----+-----------+---------+--------------------

关于这个问题(),我有两个表
orders
order\u items
。我需要按天对结果进行分组。但是我还需要从另一个表中获得每天使用的
能量的总和。当我尝试使用联接时,每天的顺序都会出错(它们没有被求和)。不知道我做错了什么

我希望每天都能得到

  • 当天创建的所有订单使用的
    order\u项目的总和
  • 订单的总和。当天创建的所有订单的订单总和
创建的
订单金额
,对应于当天创建的最新
订单
这是我的
订单
表格

+----+-----------+---------+---------------------+
| 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 |
+----+-----------+---------+---------------------+
+----+----------+-------------+---------------------+
| 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 |
+----+----------+-------------+---------------------+
这是我的
订单项目

+----+-----------+---------+---------------------+
| 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 |
+----+-----------+---------+---------------------+
+----+----------+-------------+---------------------+
| 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          |
+---------------+-----------------+-------------------+---------------------+----------------+
这是我尝试过的查询,但是我得到了错误的结果,顺序和计算不正确。它显示的内容与上次订单和相同

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)
)
这是一把小提琴:

始终根据表之间的关系(在本例中,orders.id与order\u items.order\u id)将表连接在一起,然后分组。为避免加入时多个订单项目的订单金额重复,请首先按订单id对订单项目进行分组

select 
    date(o.created_at) date_of_month,
    sum(i.total_energy_used),
    max(o.created_at),
    sum(order_sum) as total_order_sum
from orders o
inner join (
    select order_id, sum(total_energy_used) total_energy_used
    from order_items i
    group by order_id
) i on o.id = i.order_id
group by date(o.created_at)
从这一点开始,您可以使用max(o.created_at)再次对订单执行联接,以获得上一个订单的订单和。
这个故事的寓意是:关注您的粒度。

始终根据表之间的关系(在本例中,orders.id与order\u items.order\u id)将表连接在一起,然后分组。为避免加入时多个订单项目的订单金额重复,请首先按订单id对订单项目进行分组

select 
    date(o.created_at) date_of_month,
    sum(i.total_energy_used),
    max(o.created_at),
    sum(order_sum) as total_order_sum
from orders o
inner join (
    select order_id, sum(total_energy_used) total_energy_used
    from order_items i
    group by order_id
) i on o.id = i.order_id
group by date(o.created_at)
从这一点开始,您可以使用max(o.created_at)再次对订单执行联接,以获得上一个订单的订单和。
这个故事的寓意是:关注您的粒度。

您的问题是您正在从
订单
中进行选择,实际上您需要按日期聚合
订单。因此,请从您加入的两个聚合子查询中进行选择。唯一的问题是
last\u order\u sum
,一旦我们知道最后一个订单日期,我们就可以在进一步的子查询中选择它

select 
  order_date,
  o.total_order_sum,
  oi.total_energy_used,
  o.last_order_date,
  (
    select order_sum
    from orders last_order
    where lastorder.created_at = o.last_order_date
  ) as last_order_sum
from 
(
  select
    date(created_at) as order_date,
    sum(order_sum) as total_order_sum,
    max(created_date) as last_order_date
  from orders
  group by date(created_at)
) o
inner join 
(
  select
    date(created_at) as order_date,
    sum(energy_used) as total_energy_used
  from order_items
  group by date(created_at)
) oi using(order_date)
order by order_date;

您的问题是,您正在从
订单
中进行选择,实际上您希望按日期聚合
订单
。因此,请从您加入的两个聚合子查询中进行选择。唯一的问题是
last\u order\u sum
,一旦我们知道最后一个订单日期,我们就可以在进一步的子查询中选择它

select 
  order_date,
  o.total_order_sum,
  oi.total_energy_used,
  o.last_order_date,
  (
    select order_sum
    from orders last_order
    where lastorder.created_at = o.last_order_date
  ) as last_order_sum
from 
(
  select
    date(created_at) as order_date,
    sum(order_sum) as total_order_sum,
    max(created_date) as last_order_date
  from orders
  group by date(created_at)
) o
inner join 
(
  select
    date(created_at) as order_date,
    sum(energy_used) as total_energy_used
  from order_items
  group by date(created_at)
) oi using(order_date)
order by order_date;

你们所要求的和你们在输出中向我们展示的是不相关的。假设是打字错误:

select so.dtDay as date_of_month, so.order_sum as total_order_sum,
   eu.energy_used as total_energy_used,
   o.created_at as last_order_date,
   o.order_sum as last_order_sum
from (
select left(created_at,10) as dtDay, sum(order_sum) as order_sum, max(id) as last_insert_id
from orders
group by left(created_at,10)
order by created_at
) so
inner join orders o on o.id = so.last_insert_id
left join (select left(created_at,10) as dtDay, sum(energy_used) as energy_used
from order_items
group by left(created_at,10)) eu on so.dtDay = eu.dtDay;

您的要求与您在输出中向我们展示的内容不相关。假设是打字错误:

select so.dtDay as date_of_month, so.order_sum as total_order_sum,
   eu.energy_used as total_energy_used,
   o.created_at as last_order_date,
   o.order_sum as last_order_sum
from (
select left(created_at,10) as dtDay, sum(order_sum) as order_sum, max(id) as last_insert_id
from orders
group by left(created_at,10)
order by created_at
) so
inner join orders o on o.id = so.last_insert_id
left join (select left(created_at,10) as dtDay, sum(energy_used) as energy_used
from order_items
group by left(created_at,10)) eu on so.dtDay = eu.dtDay;

那么,在
创建的
被视为订单日期?这适用于
订单。在
创建和
订单项目。在
创建?@ThorstenKettner是的,这是正确的如果你想分组,为什么不使用
分组依据
?你使用的是什么版本的MySQL?(获取最后的订单金额可能有点棘手,使用MySQL 8比以前的版本更容易解决。)@ThorstenKettner我使用的是5.5So,
created_at
被认为是订单日期吗?这适用于
订单。在
创建和
订单项目。在
创建?@ThorstenKettner是的,这是正确的如果你想分组,为什么不使用
分组依据
?你使用的是什么版本的MySQL?(获取最后的订单金额可能有点棘手,使用MySQL 8比以前的版本更容易解决。)@ThorstenKettner我正在使用5.5谢谢,我想这就是我想要的。只需要找出最后一个连接就可以获得订单数量到目前为止,运气不好,我尝试使用order by created_at并限制一个,但无法获得最后一个订单数量。整个过程将是一个子查询(比如X),然后您必须从X中选择*左连接订单o on max_created_at=o.created_at。再次注意复制,在订单中创建的_总是唯一的吗?谢谢,我想这就是我要找的。只需要找出最后一个连接就可以获得订单数量到目前为止,运气不好,我尝试使用order by created_at并限制一个,但无法获得最后一个订单数量。整个过程将是一个子查询(比如X),然后您必须从X中选择*左连接订单o on max_created_at=o.created_at。再次注意重复,在订单中创建的_是否总是唯一的?