时间表统计PHP页面

时间:2010-10-14 02:17:22

标签: php mysql

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

如果我想创建一个向我显示每小时条目数的页面,我是否需要24个查询,每小时一个,或者最好的方法是什么。

我希望图表显示如下:

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

等......

2 个答案:

答案 0 :(得分:1)

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. 根据日期时间部分LEFT JOIN到您的数据表。

       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
    
  5. 为什么是数字,而不是日期?

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

答案 1 :(得分:0)

  SELECT COUNT(*),
         HOUR(`dPostTime`) AS `hr`
    FROM `table`
GROUP BY `hr`

之后,php格式hr等于'hr - 1' - hr