当计数为 0 时,MySQL 每天计数

Nat*_*n H 1 php mysql sql timestamp

我有一个 MySQL 查询:

SELECT COUNT(*) AS total,  DATE_FORMAT(event.serverTime,'%Y-%m-%d') AS sdate
                    FROM event
                    WHERE
                    event.serverTime >= :startDate
                    AND event.serverTime <= :endDate 
                    GROUP BY sdate;
Run Code Online (Sandbox Code Playgroud)

哪个正确返回如下内容:

2011-08-10 => 5  
2011-08-15 => 6
Run Code Online (Sandbox Code Playgroud)

但是,我还想获取计数为 0 的日期。所以假设 startDate 是 2011-08-10 并且 endDate 是 2011-08-15,我会看到:

2011-08-10 => 5  
2011-08-11 => 0  
2011-08-12 => 0  
2011-08-13 => 0  
2011-08-14 => 0  
2011-08-15 => 6
Run Code Online (Sandbox Code Playgroud)

我正在使用 PHP,所以理论上我可以做一些复杂的循环并以某种方式填补空白,但我想知道是否有更好的解决方案?

请注意,如果没有好的 MySQL 解决方案存在,我也愿意接受好的 PHP 解决方案

小智 5

如果你想每天计数项目 0 结果,

尝试这个 :

set @date_start := (SELECT MIN(date_col) FROM my_table), 
    @date_end := (SELECT MAX(date_col) FROM my_table), 
    @i := 0;
SELECT DATE(ADDDATE(@date_start, INTERVAL @i:=@i+1 DAY)) AS date,
IFNULL((
    SELECT COUNT(*) FROM my_table AS m2
    WHERE DATE(m2.date_col) = DATE(ADDDATE(@date_start, INTERVAL @i DAY))
),0) AS total
FROM my_table AS m1
HAVING @i < DATEDIFF(@date_end, @date_start)
Run Code Online (Sandbox Code Playgroud)

输出 :

[
    {
        "date": "2017-03-01",
        "total": "0"
    },
    {
        "date": "2017-03-02",
        "total": "0"
    },
    {
        "date": "2017-03-03",
        "total": "0"
    },
    {
        "date": "2017-03-04",
        "total": "0"
    },
    {
        "date": "2017-03-05",
        "total": "0"
    }
]
Run Code Online (Sandbox Code Playgroud)