我有一个名为 dPostTime 的字段,其中存储了条目的日期和时间。
如果我想创建一个显示每小时条目数的页面,我是否需要进行 24 个查询(每小时一个),或者执行此操作的最佳方法是什么。
我希望图表显示如下:
5-6pm - 24 posts
6-7pm - 56 posts
7-8pm - 34 posts
8-9pm - 35 posts
等等……
最佳答案
MySQL 没有递归功能,因此您只能使用 NUMBERS 表技巧 -
创建一个仅保存递增数字的表 - 使用 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;
使用以下方式填充表格:
INSERT INTO NUMBERS (id) VALUES (NULL)
...您需要的任意数量的值。
使用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
根据日期时间部分左连接到数据表。
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/