mysql每日计数ifnull零

mysql每日计数ifnull零,mysql,Mysql,我有一个疑问 SELECT count(*), cdate FROM tabl GROUP BY YEAR(cdate), MONTH(cdate), DAY(cdate); 这是返回每日计数,但仅针对cdate列中存在的天数,我想要最后X个天数的所有天数,包括计数为零的天数。我怎样才能做到这一点 cdate格式为%Y-%m-%d此查询将仅返回表tabl中可用的数据 要获取所有日期的信息,您需要一些包含日期行的表。通常,我会使用日期维度表并将其与tabl连接,如下所示: SELECT IS

我有一个疑问

SELECT count(*), cdate 
FROM tabl 
GROUP BY YEAR(cdate), MONTH(cdate), DAY(cdate);
这是返回每日计数,但仅针对cdate列中存在的天数,我想要最后X个天数的所有天数,包括计数为零的天数。我怎样才能做到这一点


cdate格式为%Y-%m-%d

此查询将仅返回表tabl中可用的数据

要获取所有日期的信息,您需要一些包含日期行的表。通常,我会使用日期维度表并将其与tabl连接,如下所示:

SELECT ISNULL(count(1), 0), cdate 
FROM DimDate D
LEFT JOIN tabl T ON D.Date = T.cdate
GROUP BY YEAR(D.Date), MONTH(D.Date), DAY(D.Date);

如果你有一个数字表,那么你可以使用它。否则,您可以使用技巧。大概是这样的:

select date_sub(curdate, 1 - interval n.n day) as thedate,
       count(t.cdate)
from (select (@rn := @rn + 1) as n
      from tabl
      limit 100
     ) n left join
     tabl t
     on t.cdate = date_sub(curdate, 1 - interval n.n day)
group by n.n;

这基本上使用您现有的表来倒数n天,在本例中为100天。假设表格足够大,您可以调整limit子句以获得您想要的任意天数。

如果没有额外的工作,您就无法做到这一点。mysql不能/不会凭空创建行/记录。如果您希望列出不存在记录的天数,您需要提供它们-例如,一个临时表,其中包含您想要加入的范围内每个日期的日期。您使用的是MySQL还是MariaDB。对于MariaDB,使用MySQL不需要额外的表。我想我知道了,所以为了得到最后X天的数量,我只使用t.cdate?