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