我不是数据库专家。我正在开展一个项目,我们需要每天在日历中用户选择的两个日期之间显示页面浏览量。我有以下
带来的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
----------------------
任何帮助都将受到高度赞赏。
答案 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_OBJECTS
或DUAL
生成行。当您在查询中使用DATE_FORMAT
时,您似乎使用了MySQL。之前发布了关于how to make a row generator in MySQL的问题。它声明:
讨厌这样说,但是MySQL是唯一没有此功能的四大RDBMS。