MySQL 生成每日配置文件 View 报告并填补空白

标签 mysql date-range

我将在 Chart.js 中绘制每日个人资料 View 。我有两个表,一个用于跟踪每天的个人资料访问,名为“stats_profile_views”,第二个表包含名为“calendar”的一年中的所有日期 enter image description here 我想显示登录每个供应商时最近 7 天的个人资料 View 。

尝试了以下查询,

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

我喜欢获取过去 7 天的记录,其中 view_count 为零,以表示“stats_profile_views”表中的不可用记录。但是当应用 WHERE vendor_id = '110' 时,它无法返回此类记录,并且仅给出与 vendor_id = '110' 相关的 3 条记录。但它在没有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(包含所有行的表)LEFT JOIN(其中包含间隙的表)。然后包含左连接表的额外条件作为额外连接条件,而不是 where 子句。

如果您想对结果进行分组,那么您需要指出您正在尝试执行的操作。也许对 view_counts 求和?但是,如果您打算这样做,那么您就不会在结果中包含像 id 这样的列。

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

关于MySQL 生成每日配置文件 View 报告并填补空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008247/

相关文章:

postgresql - 将无界范围插入 TSRANGE Postgresql

sql - 根据星期几生成两个日期之间的每周范围

t-sql - 日期范围交点

php - 如何在PDO查询中获取列的SUM

php - 如何从 Mysql 中的值以外的列中选择所有值?

mysql - Docker:将 table.sql 导入 mydatabase

excel - 查找并发、重叠、日期范围的数量

mysql - golang sql查询超时

php - MYSQL查询开始时间和结束时间

MySQL - LIKE 尾随通配符与范围搜索