我即将在chart.js中绘制每日个人资料视图。我有两个表格,每天跟踪名为" 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"" stats_profile_views"中获取超过7天的记录,其中包含view_count为0的不可用记录。表。但是当申请WHERE vendor_id
=' 110'它无法返回此类记录,仅提供与vendor_id
=' 110'相关的3条记录。但是没有vendor_id过滤器它会很好用。
使用vendor_id进行过滤时,如何将使用view_count填充的最近7天记录设为零。任何人都可以指导我找到解决方案。
答案 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
等列。
另外,请在每个对列的引用中包含表别名。