【问题标题】:MYSQL: Count entries in a "event" table, grouping by date and row count - for a date periodMYSQL:计算“事件”表中的条目,按日期和行数分组 - 用于日期期间
【发布时间】:2010-09-15 21:38:20
【问题描述】:

我有这个查询来按日期计算表中的“视图”。它显然只给了我有活动的日期,但我希望我可以让 MySQL 在选定的时间段内返回数据。例如 30 天的 30 行,为没有匹配行的日期创建空数据。

我希望避免使用 PHP 来解决这个问题,所以我想我会在这里询问有关如何通过智能查询来完成此任务的建议。

查询:

SELECT count(ID) AS views, date AS view_date
FROM logging.views 
WHERE date < DATE_SUB(NOW(),INTERVAL 30 DAY) 
GROUP BY DAY(date)";

下面的示例只给了我 7 行,显然是因为在选定的 30 天间隔中只有匹配 7 个不同天的条目。我希望我能得到 30 行,代表设定间隔内的所有天。

输出:

Array
(
    [0] => Array
        (
            [date] => 2010-09-01 22:04:19
            [views] => 20
        )

    [1] => Array
        (
            [date] => 2010-08-13 00:15:54
            [views] => 4
        )

    [2] => Array
        (
            [date] => 2010-08-24 17:46:53
            [views] => 2
        )

    [3] => Array
        (
            [date] => 2010-08-25 07:18:11
            [views] => 35
        )

    [4] => Array
        (
            [date] => 2010-08-26 08:02:47
            [views] => 12
        )

    [5] => Array
        (
            [date] => 2010-08-27 09:56:05
            [views] => 29
        )

    [6] => Array
        (
            [date] => 2010-08-28 12:46:17
            [views] => 30
        )

)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    SQL 中常见的解决方案是创建一个包含这 30 天的临时表,并将 LEFT OUTER JOIN 它添加到您的 views 表中。

    SELECT COUNT(v.ID) AS views, d.date AS view_date
    FROM logging.alldays d
    LEFT OUTER JOIN logging.views v ON d.date = v.date
    WHERE d.date < DATE_SUB(NOW(),INTERVAL 30 DAY) 
    GROUP BY d.date
    

    或者将其设为非临时表,并在接下来的 100 年中预先填充所有天数。这只有 36525 行,这对于 RDBMS 来说很容易。


    但是如果我想按小时或分钟查询呢?

    那么可能临时表方法会更容易。

    基本上,SQL 擅长将数据集连接到其他数据集——而不是将数据连接到无中生有的状态。因此,您必须在某处制作一组数据才能加入它。

    某些品牌的 SQL 数据库具有内置函数,可生成表示某些有用值范围的临时数据集。例如,PostgreSQL 有generate_series()。不幸的是,MySQL 不提供这种类型的功能。

    【讨论】:

    • 很好的建议。但是如果我想按小时或分钟查询呢?我猜一个非临时表对于 36525*60*60 行来说会太大?
    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 2014-11-06
    • 2018-09-20
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多