MYSQL:计算“事件”表中的条目,按日期和行计数分组 - 表示日期

时间:2010-09-15 21:38:20

标签: mysql

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

我希望避免使用PHP来解决这个问题,所以我想我会在这里询问如何通过智能查询来实现这一目标。

QUERY:

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
        )

)

1 个答案:

答案 0 :(得分: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不提供这种功能。