MySQL 生成每日个人资料浏览量报告以填补空白

MySQL to generate daily profile views reports with filled gaps

我即将在 chart.js 中绘制每日个人资料浏览量。我有两个 table,一个用于跟踪每天的个人资料访问,名为 "stats_profile_views",第二个带有一年中的所有日期,名为 "calendar" 我想在登录每个供应商时显示最近 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" table 中的不可用记录,我喜欢用 view_count 零填充过去 7 天的记录。但是当应用 WHERE vendor_id = '110' 时它无法 return 这样的记录并且只给出 3 条与 vendor_id = '110' 相关的记录。但它在没有 vendor_id 过滤器的情况下工作得很好。

当使用 vendor_id 过滤时,如何将最近 7 天的记录中 view_count 填充为零。请任何人指导我找到解决方案。

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(table 包含所有行)LEFT JOIN(table 中有空格)。然后包括左连接的额外条件 table 作为额外连接条件而不是 where 子句。

如果您想对结果进行分组,那么您需要说明您正在尝试做什么。也许总结 view_counts?但是,如果您打算这样做,那么您将不会在结果中包含像 id 这样的列。

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