如何 mysql 按日期分组多左连接

how to mysql group by date multiple left join

我有以下架构: http://sqlfiddle.com/#!9/bd3a4/1 我想 按 date() 分组并添加 where user_id = ?.. 每天并计算每天的结果。 所需结果天|TotalRequests|TotalOrders

您可以使用以下查询:

SELECT
DATE(o.created_at) AS Day
,COUNT(r.id) AS TotalRequests
,COUNT(o.id) AS TotalOrders 
FROM orders o
LEFT JOIN
requests r ON
r.id = o.request_id
WHERE o.user_id = 3
GROUP BY DATE(r.created_at), DATE(o.created_at),o.user_id

由于您可能在第 1 天有一个订单,在第 8 天有一个请求,您可能在一侧有条目而在另一侧没有条目。为了满足您的需求,我会按日期单独执行所有订单和请求的 UNION。然后将这些值汇总。内部预聚合结果查询是每个用户应用 WHERE 子句的地方。预聚合查询还有一个 recSource 列来指示记录来自订单的 'O' 和请求的 'R',因此汇总知道分别存储总计数的列。

select
      preAgg.recDate,
      SUM( case when preAgg.recSource = 'O' then preAgg.recCount else 0 end ) as OrderCount,
      SUM( case when preAgg.recSource = 'R' then preAgg.recCount else 0 end ) as RequestCount
   from
      ( select
              date(o.created_at) recDate,
              'O' as recSource,
              count(*) as recCount
           from
              orders o
           where
              o.user_id = 3
           group by
              date(o.created_at)
       UNION ALL
       select
              date(r.created_at) recDate,
              'R' as recSource,
              count(*) as recCount
           from
              requests r
           where
              r.user_id = 3
           group by
              date(r.created_at) ) preAgg
   group by
      preAgg.recDate
   order by 
      preAgg.recDate

为了优化查询,我会确保您的订单和请求 table 都有一个索引 ( user_id, created_at)。

SQL Fiddle result