我正在疯狂地获得它应该是一个简单的查询。我有下表:
每日登记表: 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分。用户可以在一天内拥有多个条目。有谁看到我做错了什么?非常感谢。
答案 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;