使用日历表的用户活动报告

时间:2014-07-28 03:02:39

标签: mysql

我正在疯狂地获得它应该是一个简单的查询。我有下表:

每日登记表: tbl_checkin (uniqueid,userid,clock)

示例数据:

1   1   7/25/2014 12:00:00 AM
2   1   7/25/2014 2:37:05 PM
3   2   7/25/2014 3:22:29 PM

日历表:日历(日期字段)

样本数据包含2012年至2050年的日期(即2012年1月1日上午12:00:00等)。

我希望得到这个结果:

Date:     Count:
Jul 21    0
Jul 22    0
Jul 23    0
Jul 24    0
Jul 25    3
Jul 26    0
Jul 27    0
Jul 28    0

我的查询指定了日期范围。在上面的示例中,我指定了1周,但我可以指定任何日期范围。我最接近查询的是:

SELECT 
 date_format(calendar.datefield, '%b %e') AS clockdate,
COUNT(*) AS total
FROM tbl_checkin RIGHT JOIN calendar ON (DATE(tbl_checkin.clock) = calendar.datefield)
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE('2014-07-21')) FROM tbl_checkin) 
AND (SELECT MAX(DATE('2014-07-28')) FROM tbl_checkin))
GROUP BY clockdate;

我得到的结果是:

Date:     Count:
Jul 21    1
Jul 22    1
Jul 23    1
Jul 24    1
Jul 25    3
Jul 26    1
Jul 27    1
Jul 28    1

出于某种原因,我在没有任何东西的日期得到1分。用户可以在一天内拥有多个条目。有谁看到我做错了什么?非常感谢。

1 个答案:

答案 0 :(得分:1)

使用count(*)时,tbl_checkin.clock is null也被计为1的行(因为right join)。我们只需要将count(*)替换为count(tbl_checkin.clock)

SELECT 
 date_format(calendar.datefield, '%b %e') AS clockdate,
 COUNT(tbl_checkin.clock) AS total
FROM tbl_checkin 
RIGHT JOIN calendar ON DATE(tbl_checkin.clock) = calendar.datefield
WHERE calendar.datefield BETWEEN '2014-07-21' AND '2014-07-28'
GROUP BY clockdate;