如何 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)。
我有以下架构: 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)。