2012-09-02 48 views
2

之间的所有日期我不是一个数据库专家。我只是在制作一个项目,我们需要每天在日历中显示用户选择的两个日期之间的页面浏览量。我已经带来以下适用于派生表和万年历表右连接获得2天

SQL查询就会像

SELECT DATE_FORMAT(created_at,'%d %b %Y') as this_date, count(*) as Views 
from promotion_insights WHERE f_id = '2' AND p_id = '12' 
AND created_at BETWEEN '2012-08-15' AND '2012-08-19' 
GROUP BY this_date 

结果的页面访问量总数的到来犹如

---------------------- 
this_date View 
--------------------- 
15 Aug 2012  3 
16 Aug 2012  2 
---------------------- 

我还有万年历表和存储procedure.calendar表有一列名为(datefield)的日期。我已经通过调用存储过程生成日期,所以不用担心。现在我想要的,就是让最新的基础上右连接到具有高于表(this_date和视图列)与日历表由用户选择,并具有0次日期把0之间展现all_dates。 COUNT(*)也由returing 1改为0

预期输出的加入我要制造麻烦是这样的:

---------------------- 
this_date View 
--------------------- 
15 Aug 2012  3 
16 Aug 2012  2 
17 Aug 2012  0 
18 Aug 2012  0 
19 Aug 2012  0 

---------------------- 

任何帮助将非常高度赞赏。

+1

为什么你在SQL,而不是在你的应用程序,其中从一个日期循环到另一个是微不足道的这样做呢? –

回答

1

您可以使用日历表轻松做到这一点 - 这是大多数数据库的一个好主意。

SELECT DATE_FORMAT(c.date,'%d %b %Y') as this_date, count(*) as Views 
from calendar c left outer join 
    promotion_insights pi 
    on c.date between '2012-08-15' AND '2012-08-19' and 
     c.date = pi.created_at 
WHERE f_id = '2' AND p_id = '12' 
GROUP BY c.date 

注意:这里假定created_at存储为日期而不是日期时间。有时间组件可能会导致比较失败。

0

如果你想这样做,在SQL你需要一个排发生器产生连续的每一天在你的日期范围,然后再加入您的查询所产生的行,得到的结果为每一天在你的日期范围(甚至如果在该范围内某天没有数据存在)。

如果您使用的是Oracle,你可以使用ALL_OBJECTSDUAL生成行。由于您在查询中使用DATE_FORMAT,因此您似乎使用MySQL。 how to make a row generator in MySQL之前发布了一个问题。它声称:

讨厌这么说,但MySQL是唯一没有此功能的四大关系型数据库管理系统。

+0

谢谢你们的帮助...... –