MySQL组按日显示空白日

时间:2013-06-12 23:11:05

标签: mysql

+-------------+---------------------+
| 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计数?

1 个答案:

答案 0 :(得分:2)

假设它是一个选项,请考虑创建一个Dates Lookup表。然后,您可以轻松使用OUTER JOIN创建列表。这是关于它的SO post

使用名为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以获取一些示例。