使用Mysql连接日历表进行计数查询

使用Mysql连接日历表进行计数查询,mysql,sql,Mysql,Sql,我试图将日历表加入到每天的计数查询中,以便显示给定范围内的所有日期,而不仅仅是有计数的日期 目前,我查询的是从今天开始的最后7天的计数: ctn followupdate 2 2019-07-20 1 2019-07-19 我试图将所有7天都显示出来,如下所示: ctn followupdate 0 2019-07-21 2 2019-07-20 1 2019-07-19 0 2019-07-18 0 2019-

我试图将日历表加入到每天的计数查询中,以便显示给定范围内的所有日期,而不仅仅是有计数的日期

目前,我查询的是从今天开始的最后7天的计数:

ctn    followupdate
2      2019-07-20
1      2019-07-19
我试图将所有7天都显示出来,如下所示:

ctn    followupdate
0      2019-07-21
2      2019-07-20
1      2019-07-19
0      2019-07-18
0      2019-07-17
0      2019-07-16
0      2018-07-15
我最初的问题是:

SELECT count(*) as cnt, date(followed_up_on) AS followupdate 
FROM wt_follow_up 
WHERE followed_up_on > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY followupdate
我已经建立了一个日历表,上面有到2040年的所有日期

dt
2010-01-01
...
2040-01-01
如何加入此表以获得所需的结果?我试过:

SELECT count(*) as cnt, date(followed_up_on) AS followupdate
FROM wt_follow_up 
WHERE followed_up_on > DATE_SUB(NOW(), INTERVAL 7 DAY)
JOIN calendar_table c ON c.dt BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()
GROUP BY c.dt
但这会在连接行上产生一个未指定的语法错误

编辑: wt_跟进表结构:

wt_followup_id int(11)
wt_id (int11)
followed_up_on (timestamp)
示例数据

wt_followup_up      wt_id    followed_up_on
1                    30      2019-07-20 07:34:56
2                    32      2019-07-20 07:34:56
日历表:

dt
2010-01-01
...
2040-01-01

因为
where
子句应该在join之后,以避免
date()
函数在
select中使用
c.dt

SELECT count(f.wt_followup_up) as cnt, c.dt AS followupdate
FROM calendar_table c 
LEFT JOIN wt_follow_up f ON c.dt=date(f.followed_up_on)
WHERE c.dt between (curdate()- interval 7 day) and curdate()
GROUP BY c.dt

您的查询应按以下方式实现-

SELECT dt,COUNT(*)
FROM calendar_table 
LEFT JOIN your_table
ON calendar_table.dt= your_table.followupdate 
WHERE dt BETWEEN 'Date1' AND 'Date2'
-- Filter dates you wants data for, 
-- Give value to Date1 and Date2 as per your requirement
GROUP BY dt

请尝试以下查询。dt表应该在左侧

SELECT c.dt, count(*) AS count FROM `calendar_table` AS C LEFT JOIN `wt_follow_up` AS f ON c.dt = date(f.followed_up_on) where c.dt between '2019-07-15' and '2019-07-21' GROUP BY c.dt

您应该从日历表中开车,然后左键加入后续表。不需要在where子句上硬编码日期,从数据和now()中删除time元素非常重要。如此给定

drop table if exists t;
create table t
(id int,    followupdate timestamp);
insert into t values
(2  ,    '2019-07-20 01:00:01'),(3  ,    '2019-07-20 02:00:00'),
(1  ,    '2019-07-19 05:00:01');

and dates

+---------------------+------------+
| now()               | dte        |
+---------------------+------------+
| 2019-07-21 09:24:31 | 2019-07-14 |
| 2019-07-21 09:24:31 | 2019-07-15 |
| 2019-07-21 09:24:31 | 2019-07-16 |
| 2019-07-21 09:24:31 | 2019-07-17 |
| 2019-07-21 09:24:31 | 2019-07-18 |
| 2019-07-21 09:24:31 | 2019-07-19 |
| 2019-07-21 09:24:31 | 2019-07-20 |
+---------------------+------------+
7 rows in set (0.01 sec)

select d.dte,count(t.id) cnt
from   dates d
left   join   t on d.dte = date(t.followupdate)
where  d.dte >= date_sub(date(now()),interval  7 day) and
         d.dte <= date(now())
group  by d.dte
order  by d.dte desc

 +------------+-----+
| dte        | cnt |
+------------+-----+
| 2019-07-21 |   0 |
| 2019-07-20 |   2 |
| 2019-07-19 |   1 |
| 2019-07-18 |   0 |
| 2019-07-17 |   0 |
| 2019-07-16 |   0 |
| 2019-07-15 |   0 |
| 2019-07-14 |   0 |
+------------+-----+
8 rows in set (0.02 sec)
删除表格(如果存在);
创建表t
(id int,followupdate时间戳);
插入到t值中
(2  ,    '2019-07-20 01:00:01'),(3  ,    '2019-07-20 02:00:00'),
(1  ,    '2019-07-19 05:00:01');
和日期
+---------------------+------------+
|现在()| dte|
+---------------------+------------+
| 2019-07-21 09:24:31 | 2019-07-14 |
| 2019-07-21 09:24:31 | 2019-07-15 |
| 2019-07-21 09:24:31 | 2019-07-16 |
| 2019-07-21 09:24:31 | 2019-07-17 |
| 2019-07-21 09:24:31 | 2019-07-18 |
| 2019-07-21 09:24:31 | 2019-07-19 |
| 2019-07-21 09:24:31 | 2019-07-20 |
+---------------------+------------+
一组7行(0.01秒)
选择d.dte,计数(t.id)cnt
从日期d开始
d.dte=日期(t.followupdate)上的左连接t
其中d.dte>=日期(日期(现在()),间隔7天)和

d、 dte您不应该将筛选器放在联接之后,而应该放在联接之前的表上,否则您将放置一个内部筛选器,而不是左侧筛选器

    SELECT count(f.wt_followup_up) as cnt, c.dt AS followupdate FROM calendar_table c 
    LEFT JOIN 
    wt_follow_up f ON ( c.dt=date(f.followed_up_on) and c.dt between (curdate()- interval 7 day) 
   and curdate() )
    GROUP BY c.dt

这仍然只给出有计数的天数,而不是全部7天。@warrenfitzhenry添加了左联接,以便从主表中提取记录。如果没有匹配项,则返回0,但仍然相同。请注意,
f.followind\u on
是一个日期时间(
2019-07-20 12:00:00
),因此第一行是
日期。我试着在连接中添加这个:
左连接wt\u follow\u up f ON date(f.followind\u up\u ON)=c.dt
。如果我不这样做,结果是空的…你能添加表结构和样本插入记录,这样就可以在本地进行检查了!这将返回
cnt:1,followupdate:NULL
对于所有6个日期都没有计数,并且
ctn:2,followupdate:2019-07-20
对于一个日期有计数。谢谢。为什么计数在没有计数的日子里返回1?它不应该返回。请你拿一份你的数据样本摆弄一下好吗。