功能:从test数据表中查询近一个月的统计结果,根据time进行统计,没有数据的日期自动补0。
第一步:生成一个近一个月的表,表有两列,第一列是近一个月的时间,格式为“年-月-日”,第二列为填充的0
SET @i := - 1;
SELECT
date_format( DATE_SUB( NOW( ), INTERVAL ( @i := @i + 1 ) DAY ), '%Y-%m-%d' ) AS date
FROM
test
WHERE
@i <= ( SELECT DATEDIFF( NOW( ), DATE_FORMAT( DATE_SUB( NOW( ), INTERVAL 1 MONTH ), '%Y-%m-%d' ) ) )
第二步:统计test表的数据。
SELECT DATE_FORMAT( time, '%Y-%m-%d' ) AS date,
COUNT(1) AS value
FROM test m
WHERE m.time>= DATE_SUB(CURDATE(),INTERVAL 1 MONTH)i
GROUP BY DATE_FORMAT( time, '%Y-%m-%d' )
第三步:将两个表左连接。
SET @i := - 1;
SELECT
a.date as date ,
IFNULL(b.VALUE,0) as value
FROM
(
SELECT
date_format( DATE_SUB( NOW( ), INTERVAL ( @i := @i + 1 ) DAY ), '%Y-%m-%d' ) AS date
FROM
test
WHERE
@i <= ( SELECT DATEDIFF( NOW( ), DATE_FORMAT( DATE_SUB( NOW( ), INTERVAL 1 MONTH ), '%Y-%m-%d' ) ) )
) a
LEFT JOIN (
SELECT DATE_FORMAT( time, '%Y-%m-%d' ) AS date,
COUNT(1) AS value
FROM test m
WHERE m.time>= DATE_SUB(CURDATE(),INTERVAL 1 MONTH)i
GROUP BY DATE_FORMAT( time, '%Y-%m-%d' )
) b ON a.date = b.date
ORDER BY a.date
遇到的问题:
我用这个sql语句时,只能显示29条数据。
原因:
我得test数据集只有29条数据,INTERVAL ( @i := @i + 1 ) DAY 的作用是有一条数据就可以进行循环一次,所以我的表中最多只有29条数据,最多循环29次。所以显示29条数据。
解决办法:
可以创建一个新表,存在多条数据,在第一步时,将test替换成创建得新表,就可以显示完整。