在派生表和日历表上应用右连接以获取两天之间的所有日期

时间:2012-09-02 07:33:30

标签: mysql sql

我不是数据库专家。我正在开展一个项目,我们需要每天在日历中用户选择的两个日期之间显示页面浏览量。我有以下

带来的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和view列)的日历表进行正确的连接,以显示用户选择的all_dates,并将0设置为具有0个视图的日期。 count(*)也是通过撤回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

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

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分: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存储为日期,而不是日期时间。有时间部分可能会导致比较。

答案 1 :(得分:0)

如果要在SQL中执行此操作,则需要行生成器为日期范围内的每一天生成一行,然后将查询加入生成的行以获取日期范围内每天的结果(即使该范围内的某些天没有数据存在。)

如果您使用的是Oracle,则可以使用ALL_OBJECTSDUAL生成行。当您在查询中使用DATE_FORMAT时,您似乎使用了MySQL。之前发布了关于how to make a row generator in MySQL的问题。它声明:

  

讨厌这样说,但是MySQL是唯一没有此功能的四大RDBMS。