php - 时间表统计 PHP 页面

标签 php mysql

我有一个名为 dPostTime 的字段,其中存储了条目的日期和时间。

如果我想创建一个显示每小时条目数的页面,我是否需要进行 24 个查询(每小时一个),或者执行此操作的最佳方法是什么。

我希望图表显示如下:

5-6pm - 24 posts
6-7pm - 56 posts
7-8pm - 34 posts
8-9pm - 35 posts

等等……

最佳答案

MySQL 没有递归功能,因此您只能使用 NUMBERS 表技巧 -

  1. 创建一个仅保存递增数字的表 - 使用 auto_increment 即可轻松完成:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 使用以下方式填充表格:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...您需要的任意数量的值。

  3. 使用DATE_ADD构建日期列表,根据 NUMBERS.id 值增加天数。将“2010-01-01”和“2010-01-02”替换为您各自的开始日期和结束日期(但使用相同的格式,YYYY-MM-DD HH:MM:SS)-

    SELECT x.dt
      FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) HOUR), '%H:%i') AS dt
              FROM numbers n
             WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) HOUR) <= '2010-01-02' ) x
    
  4. 根据日期时间部分左连接到数据表。

       SELECT x.dt,
              COALESCE(COUNT(a.dPostTime), 0) AS numPerHour
         FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL (n.id - 1) HOUR), '%H') AS dt
                 FROM numbers n
                WHERE DATE_ADD('2010-01-01', INTERVAL (n.id - 1) HOUR) <= '2010-01-02' ) x x
    LEFT JOIN YOUR_TABLE a ON DATE_FORMAT(a.dPostTime, '%H') = x.dt 
     GROUP BY x.dt
     ORDER BY x.dt
    

为什么是数字,而不是日期?

简单 - 可以根据数字生成日期,就像我提供的示例一样。它还意味着使用单个表,而不是每种数据类型一个表。

关于php - 时间表统计 PHP 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929594/

相关文章:

MySQL - 在更新两个表的插入触发器之后?

mysql - SELECT REPLACE() 是否覆盖数据库中的记录

mysql - 使用 PostgreSQL 运行 ThinkingSphinx 时出错

php - 如何设置 Controller 操作的页面标题?

javascript - 如何将 html 表单发布请求翻译成 Postman

javascript - 将构建数组的 PHP 代码转换为 JS,现在 highcharts 不起作用 - 我做错了什么?

mysql - 如何通过在另一个值之前选择一个值来使 MySQL 分组?

mysql - 使用 rake db :migrate command with mysql 在 Rails 中创建表的主键问题

php - 如何在没有多个连接的情况下使用多个类?

javascript - 获取一个字符串并仅插入该字符串中的数字