MySQL用于生成每日配置文件视图报告,填补空白

时间:2016-03-15 10:11:24

标签: mysql date-range

我即将在chart.js中绘制每日个人资料视图。我有两个表格,每天跟踪名为" stats_profile_views"第二个带有一年的所有日期,名为" calendar"    enter image description here 我希望在登录每个供应商时显示最近7天的个人资料视图。

尝试以下查询,

SELECT datefield  AS DATE ,`id`, `vendor_id`, `view_date`,IFNULL(view_count,0) AS view_count
FROM (`stats_profile_views` pv)
 RIGHT JOIN bp_calendar ON (DATE(view_date) = bp_calendar.datefield)
WHERE `vendor_id` =  '110'
AND bp_calendar.datefield BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()

GROUP BY DATE
ORDER BY `view_date` asc

我喜欢在" stats_profile_views"" stats_profile_views"中获取超过7天的记录,其中包含view_count为0的不可用记录。表。但是当申请WHERE vendor_id =' 110'它无法返回此类记录,仅提供与vendor_id =' 110'相关的3条记录。但是没有vendor_id过滤器它会很好用。

使用vendor_id进行过滤时,如何将使用view_count填充的最近7天记录设为零。任何人都可以指导我找到解决方案。

1 个答案:

答案 0 :(得分:1)

SELECT
      c.datefield AS DATE
    , pv.id
    , pv.vendor_id
    , pv.view_date
    , IFNULL(pv.view_count, 0) AS view_count
FROM bp_calendar c
      LEFT JOIN stats_profile_views pv ON (DATE(pv.view_date) = c.datefield)
                  AND pv.vendor_id = '110'
WHERE c.datefield BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
ORDER BY
      pv.view_date ASC

使用外连接时,where子句必须注意不要覆盖不匹配的行,否则会获得内连接的效果。这就是你原始查询中发生的事情;因为每行都需要vendor_id ='110',但不匹配的日期不能有任何vendor_id。

此外,它通常有助于编写查询FROM(包含所有行的表)LEFT JOIN(带有间隙的表)。然后将左连接表的额外条件包括为额外连接条件而不是where子句。

如果要对结果进行分组,则需要指明您尝试执行的操作。也许总结一下view_counts?但是,如果您打算这样做,那么您不会在结果中包含id等列。

另外,请在每个对列的引用中包含表别名。