【问题标题】:MySQL Fetch Website Stats For All DaysMySQL 获取全天的网站统计信息
【发布时间】:2014-02-11 19:26:33
【问题描述】:

每次新访问者访问我的网站时,他们都会登录到数据库中。通过使用以下查询,我已经能够选择过去 7 天内特定日期的用户数:

SELECT COUNT(*) AS Hits, DATE_FORMAT(Date, '%Y-%m-%d') AS HitDay FROM(stats) WHERE Date >= DATE_SUB(SYSDATE(), INTERVAL 7 DAY) GROUP BY DATE(Date) ORDER BY Date ASC   

问题是,作为项目的一部分,我必须在 VB 中的图表中绘制这些数据,如果在特定日期没有命中,则图表上的两个日期之间存在间隔。我想知道如果没有任何访问者,是否可以返回过去七个日期内的所有日期,Hits 列上的值为 0。间隔也可以改变,所以它的范围可以从 1 到 31。

也许这可以通过过程或函数来完成?任何想法都会很棒,但我试图不填补 VB 中的空白。

【问题讨论】:

    标签: php mysql vb.net datetime statistics


    【解决方案1】:

    您可以生成 7 天,然后使用如下统计信息 LEFT JOIN

    SELECT COUNT(stats.date) AS Hits, DATE_FORMAT(days.Date, '%Y-%m-%d') AS HitDay 
    FROM
       (SELECT CURDATE() as date
        UNION SELECT CURDATE() - INTERVAL 1 DAY
        UNION SELECT CURDATE() - INTERVAL 2 DAY
        UNION SELECT CURDATE() - INTERVAL 3 DAY
        UNION SELECT CURDATE() - INTERVAL 4 DAY
        UNION SELECT CURDATE() - INTERVAL 5 DAY
        UNION SELECT CURDATE() - INTERVAL 6 DAY
        )days
    LEFT JOIN stats ON days.date = stats.date
    GROUP BY DATE(days.Date) ORDER BY days.Date ASC
    

    sqlFiddle

    如果您的时间间隔发生变化,可以指定更多如下(最多 128 天),只需将条件 < 7 更改为您的时间间隔

    SELECT COUNT(stats.date) AS Hits, DATE_FORMAT(days.Date, '%Y-%m-%d') AS HitDay 
    FROM
       (SELECT CURDATE() - INTERVAL 
         (d1.value+d2.value+d3.value+d4.value+
          d5.value+d6.value+d7.value) day as date
        FROM (SELECT 0 as value UNION SELECT 1)d1,
             (SELECT 0 as value UNION SELECT 2)d2,
             (SELECT 0 as value UNION SELECT 4)d3,
             (SELECT 0 as value UNION SELECT 8)d4,
             (SELECT 0 as value UNION SELECT 16)d5,
             (SELECT 0 as value UNION SELECT 32)d6,
             (SELECT 0 as value UNION SELECT 64)d7
        WHERE (d1.value+d2.value+d3.value+d4.value+
          d5.value+d6.value+d7.value) < 7
        )days
    LEFT JOIN stats ON days.date = DATE(stats.date)
    GROUP BY DATE(days.Date) ORDER BY days.Date ASC
    

    sqlFiddle

    【讨论】:

    • 是否可以创建类似循环的东西,因为间隔可能会改变
    • 这对我不起作用,当我的原始代码返回 3 或 6 时,它会在 Hits 列中返回 0
    • 也许加入不起作用,因为您的日期有时间值也许加入ON days.date = DATE(stats.date)
    • 我刚刚更新了我的答案以包含一个指定更多天数的版本,您可以更改间隔&lt; 7 看看。
    • 谢谢!只是最后一期,我需要包含代码WHERE NewUser = 'True',但我的业余技能并不适合这个
    猜你喜欢
    • 2023-04-09
    • 2019-07-18
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多