mysql按日期分组查询统计的时候,没有数据补0的解决办法及遇到的问题

功能:从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替换成创建得新表,就可以显示完整。

你可能感兴趣的:(mysql)