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
----------------------

我还有一个日历表和一个存储过程。日历表有一个名为(日期字段)的日期列。我已经通过调用存储过程生成了日期,所以不用担心。现在我想要的是在日期的基础上对具有日历表的上表(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

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

任何帮助将不胜感激。

4

2 回答 2

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 存储为日期,而不是日期时间。有一个时间组件可能会导致比较失败。

于 2012-09-02T13:01:00.747 回答
0

如果您想在 SQL 中执行此操作,您需要一个行生成器为您的日期范围内的每一天生成一行,然后将您的查询连接到生成的行以获取您日期范围内每一天的结果(即使没有数据在该范围内存在几天)。

如果您使用的是 Oracle,您可以使用ALL_OBJECTSDUAL来生成行。当您DATE_FORMAT在查询中使用时,您似乎使用的是 MySQL。之前发布了一个关于如何在 MySQL中制作行生成器的问题。它指出:

不想这么说,但 MySQL 是四大中唯一没有此功能的 RDBMS。

于 2012-09-02T10:20:52.513 回答