简体   繁体   English

当使用MySQL Group by的那一天没有记录时如何填充空值

[英]How to fill empty value when no record in that day using MySQL group by

SELECT `Date`, SUM(Clicks) AS Clicks, DAY(LAST_DAY(NOW()))  AS Monthdays
FROM myTbl 
WHERE ( DATE BETWEEN DATE_FORMAT(NOW(), '%Y-%m-01') AND NOW() )      
AND MoverID = 123  GROUP BY `Date` ASC 

I don't want use PROCEDURE like this: http://stackoverflow.com/questions/7252460/mysql-group-by-and-fill-empty-rows 我不想这样使用PROCEDURE: http://stackoverflow.com/questions/7252460/mysql-group-by-and-fill-empty-rows : http://stackoverflow.com/questions/7252460/mysql-group-by-and-fill-empty-rows

I don't want to create a whole day containing table like this: http://stackoverflow.com/questions/5988179/mysql-group-by-date-how-to-return-results-when-no-rows 我不想创建一整天包含这样的表: http://stackoverflow.com/questions/5988179/mysql-group-by-date-how-to-return-results-when-no-rows : http://stackoverflow.com/questions/5988179/mysql-group-by-date-how-to-return-results-when-no-rows

I can use SELECT @@global.time_zone, @@session.time_zone; 我可以使用SELECT @@global.time_zone, @@session.time_zone; in PHP and after the MySQL query result is out, I make PHP to the same timezone as MySQL, and fill the date by PHP. 在PHP中,在MySQL查询结果出来之后,我将PHP设置为与MySQL相同的时区,并用PHP填写日期。 But is it a way I can just do it in MySQL way? 但这是我可以用MySQL方式完成的方式吗?

You can use a trick to generate virtual table having all the dates you need with another table (replace aux with any table in your DB with 31 recored at least): 您可以使用技巧来生成虚拟表,该虚拟表将您需要的所有日期与另一个表一起使用(将aux替换为数据库中的任何表,其中至少有31列被重新记录):

SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d`
FROM
    `aux`,
    (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x`
WHERE
    @d < DATE_SUB(NOW(), INTERVAL 1 DAY)
LIMIT
    31

And then join you table on it: 然后加入您的表格:

SELECT
    `aux`.`d` as `Date`,
    SUM(IFNULL(`Clicks`, 0))AS `Clicks`,
    DAY(LAST_DAY(NOW())) AS `Monthdays`
FROM (
    SELECT CONVERT(@d := DATE_ADD(@d, INTERVAL 1 DAY), DATE) AS `d`
    FROM
        `aux`,
        (SELECT @d := DATE_SUB(CONVERT(DATE_FORMAT(NOW(), '%Y-%m-01'), DATETIME), INTERVAL 1 DAY)) `x`
    WHERE
        @d < DATE_SUB(NOW(), INTERVAL 1 DAY)
    LIMIT
        31
) aux
LEFT JOIN
    myTbl
    ON `Date` = `aux`.`d`
GROUP BY `aux`.`d`

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM