1
+-------------+---------------------+
| uid         | date                |
+-------------+---------------------+
|          35 | 01-11-2009 19:32:44 | 
|          35 | 01-13-2009 22:33:49 | 
|          42 | 01-23-2009 22:08:24 | 
|          42 | 02-01-2009 22:33:57 | 
|          35 | 02-01-2009 22:37:34 | 
|          35 | 04-20-2009 15:23:49 | 
+-------------+---------------------+

我想为特定的 uid 获取每天的计数,并显示空天(在一个范围内):

User 35 (21 days)
01-11-2009 -> 1
01-12-2009 -> 0
01-13-2009 -> 1
01-14-2009 -> 0
01-15-2009 -> 0
01-16-2009 -> 0
01-17-2009 -> 0
01-18-2009 -> 0
01-19-2009 -> 0
01-20-2009 -> 0
01-21-2009 -> 0
01-22-2009 -> 0
01-23-2009 -> 0
01-24-2009 -> 0
01-25-2009 -> 0
01-26-2009 -> 0
01-27-2009 -> 0
01-28-2009 -> 0
01-29-2009 -> 0
01-30-2009 -> 0
01-31-2009 -> 0
02-01-2009 -> 1

到目前为止我得到了

SELECT MONTHNAME(date), COUNT(uid) FROM cliques_referidos WHERE uid = 35 GROUP BY YEAR(date), MONTH(date), DAY(date)

如何获得介于两者之间的天数为 0?

4

1 回答 1

2

假设这是一个选项,请考虑创建一个日期查找表。然后您可以轻松地使用 anOUTER JOIN创建您的列表。这是关于它的SO帖子

datelookup使用名为 的日期字段调用查找表datevalue,那么这应该可以工作:

SELECT MONTHNAME(d.datevalue), COUNT(cr.uid) 
FROM datelookup d LEFT JOIN
    cliques_referidos cr ON d.datevalue = DATE(cr.date)
        and cr.uid = 35 
GROUP BY YEAR(d.datevalue), MONTH(d.datevalue), DAY(d.datevalue)

由于您的日期字段是日期时间,因此DATE()请在您的加入中使用。

如果您无法创建查找表,请考虑使用存储过程或函数,因为 MySQL 不支持递归 CTE。在 SO 中搜索一些示例。

于 2013-06-12T23:23:54.043 回答