【问题标题】:Timetable Stats PHP Page时间表统计 PHP 页面
【发布时间】:2010-10-14 02:17:22
【问题描述】:

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

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

我希望图表显示如下:

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

等等……

【问题讨论】:

  • 您想要包含没有记录的小时的结果(例如下午 4-5 点 - 0 个帖子)还是只包含有记录的小时的结果?

标签: php mysql


【解决方案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. 根据日期时间部分向您的数据表左连接。

       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
    

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

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

【讨论】:

  • 通过递归功能,你的意思是 MySQL 不能像 Oracle 那样使用 Connect by level 吗?我已经为 Oracle 回答了这个确切的问题:stackoverflow.com/questions/3455739/…
  • @Cyntech:正确,CONNECT BY 是 Oracle 特定的分层查询语法。递归 WITH 现在是 ANSI 标准,但 Oracle 直到 11gR2 才支持它——在 Oracle 的防御中,他们从 v2 开始就有CONNECT BY
  • 谢谢。这是解决这个问题的唯一方法吗?我有一个捕获日期和时间的字段。我打算使用 PHP 在图表中显示它
  • @BigMike:您需要生成一个连续的小时列表以进行左连接。如果是一次性事件,请使用 UNION 语句来派生您需要的表。
  • 谢谢,你能再解释一下#2吗?我需要多少个数字?
【解决方案2】:
  SELECT COUNT(*),
         HOUR(`dPostTime`) AS `hr`
    FROM `table`
GROUP BY `hr`

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

【讨论】:

  • 我看到的唯一问题是 OP 是否希望看到计数为零,因为列中没有小时值。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多