You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用MySQL统计每周各天的点击量(含无数据显示0等要求)

实现MySQL统计全历史每周各天点击量(含无数据日期显示0)

这问题我之前处理过好几次,核心思路是先构建一个包含所有星期几的基础维度表,再和你的点击数据表做左连接统计——这样既能保证哪怕某天没有点击记录,也能显示0,还能汇总所有历史数据里对应星期的总点击量。

先明确MySQL的星期函数差异

MySQL里有两个常用的星期判断函数,你可以根据需求选:

  • WEEKDAY(date):返回0(周一)到6(周日),加1就能得到1=周一、7=周日的数字格式
  • DAYOFWEEK(date):返回1(周日)到7(周六),是MySQL默认的星期排序规则

方案1:用「1=周一、7=周日」的格式统计

假设你的点击表叫clicks,有click_time(datetime类型,记录点击时间)和click_count(单条记录的点击数;若每条记录代表1次点击,后续用count逻辑代替即可)。

用CTE(MySQL 8.0+支持)生成完整星期表,再左连接统计:

WITH week_days AS (
    SELECT 1 AS day_num, '周一' AS day_name UNION ALL
    SELECT 2, '周二' UNION ALL
    SELECT 3, '周三' UNION ALL
    SELECT 4, '周四' UNION ALL
    SELECT 5, '周五' UNION ALL
    SELECT 6, '周六' UNION ALL
    SELECT 7, '周日'
)
SELECT
    w.day_num,
    w.day_name,
    COALESCE(SUM(c.click_count), 0) AS total_clicks
FROM week_days w
LEFT JOIN clicks c ON WEEKDAY(c.click_time) + 1 = w.day_num
GROUP BY w.day_num, w.day_name
ORDER BY w.day_num;

方案2:用「1=周日、7=周六」的默认格式统计

如果习惯MySQL默认的星期排序,就用DAYOFWEEK函数:

WITH week_days AS (
    SELECT 1 AS day_num, '周日' AS day_name UNION ALL
    SELECT 2, '周一' UNION ALL
    SELECT 3, '周二' UNION ALL
    SELECT 4, '周三' UNION ALL
    SELECT 5, '周四' UNION ALL
    SELECT 6, '周五' UNION ALL
    SELECT 7, '周六'
)
SELECT
    w.day_num,
    w.day_name,
    COALESCE(COUNT(c.id), 0) AS total_clicks
FROM week_days w
LEFT JOIN clicks c ON DAYOFWEEK(c.click_time) = w.day_num
GROUP BY w.day_num, w.day_name
ORDER BY w.day_num;

兼容低版本MySQL(无CTE支持)

如果你的MySQL版本低于8.0,把CTE换成子查询即可:

SELECT
    w.day_num,
    w.day_name,
    COALESCE(SUM(c.click_count), 0) AS total_clicks
FROM (
    SELECT 1 AS day_num, '周一' AS day_name UNION ALL
    SELECT 2, '周二' UNION ALL
    SELECT 3, '周三' UNION ALL
    SELECT 4, '周四' UNION ALL
    SELECT 5, '周五' UNION ALL
    SELECT 6, '周六' UNION ALL
    SELECT 7, '周日'
) w
LEFT JOIN clicks c ON WEEKDAY(c.click_time) + 1 = w.day_num
GROUP BY w.day_num, w.day_name
ORDER BY w.day_num;

关键细节说明

  • COALESCE函数:用来把左连接后没有匹配到的NULL值转换成0,完美满足「无记录日期显示0」的需求。
  • 统计逻辑调整:如果你的点击表是每条记录代表1次点击(没有click_count字段),把SUM(c.click_count)换成COUNT(c.id)id是表的主键)即可。
  • 全历史汇总:这个SQL会统计clicks表中的所有记录,按星期分组汇总,不会限制单周数据。

内容的提问来源于stack exchange,提问作者Besnik Cani

火山引擎 最新活动