填写 mysql 查询范围内缺失的日期
Fill missing dates in mysql query range
我有以下查询:
select date(updated_at) as data, COUNT(id) as numar
from `coupons`
where `user_id` = 5 and `won_by` != 0 and `updated_at` >= '2016-04-01'
group by DAY(updated_at), month(updated_at), year(updated_at)
结果是这样的:
2016-04-01- 229
2016-04-03- 30
2016-04-04- 6
2016-04-07- 1
2016-04-08- 1
2016-04-10- 1
我该怎么做才能收到这样的东西:
2016-04-01- 229
2016-04-02- 0
2016-04-03- 30
2016-04-04- 6
2016-04-05- 0
2016-04-06- 0
2016-04-07- 1
2016-04-08- 1
2016-04-10- 1
我发现执行此操作的最佳方法是简单地创建(并维护)一个包含您关心的所有日期的单列辅助 table。类似于:
创建 TABLE date_join (
日期日期不为空主键
);
然后以任何方便的方式为每个日期插入记录(手动,如果是一次性的,作为日常流程的一部分,通过存储过程等)。
此时,它只是 date_join 和您的初始查询的左连接,使用 CASE 语句将 NULL 转换为 0:
SELECT dj.date, q.numar
FROM date_join dj
LEFT JOIN (select date(updated_at) as date, COUNT(id) as numar
from `coupons`
where `user_id` = 5 and `won_by` != 0 and `updated_at` >= '2016-04-01'
group by DATE(updated_at)
) q
ON dj.date = q.date
ORDER BY dj.date;
我有以下查询:
select date(updated_at) as data, COUNT(id) as numar
from `coupons`
where `user_id` = 5 and `won_by` != 0 and `updated_at` >= '2016-04-01'
group by DAY(updated_at), month(updated_at), year(updated_at)
结果是这样的:
2016-04-01- 229
2016-04-03- 30
2016-04-04- 6
2016-04-07- 1
2016-04-08- 1
2016-04-10- 1
我该怎么做才能收到这样的东西:
2016-04-01- 229
2016-04-02- 0
2016-04-03- 30
2016-04-04- 6
2016-04-05- 0
2016-04-06- 0
2016-04-07- 1
2016-04-08- 1
2016-04-10- 1
我发现执行此操作的最佳方法是简单地创建(并维护)一个包含您关心的所有日期的单列辅助 table。类似于:
创建 TABLE date_join ( 日期日期不为空主键 );
然后以任何方便的方式为每个日期插入记录(手动,如果是一次性的,作为日常流程的一部分,通过存储过程等)。
此时,它只是 date_join 和您的初始查询的左连接,使用 CASE 语句将 NULL 转换为 0:
SELECT dj.date, q.numar
FROM date_join dj
LEFT JOIN (select date(updated_at) as date, COUNT(id) as numar
from `coupons`
where `user_id` = 5 and `won_by` != 0 and `updated_at` >= '2016-04-01'
group by DATE(updated_at)
) q
ON dj.date = q.date
ORDER BY dj.date;