我有一个名为dPostTime
的字段,其中包含条目的日期和时间。
如果我想创建一个向我显示每小时条目数的页面,我是否需要24个查询,每小时一个,或者最好的方法是什么。
我希望图表显示如下:
5-6pm - 24 posts
6-7pm - 56 posts
7-8pm - 34 posts
8-9pm - 35 posts
等......
答案 0 :(得分:1)
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
根据日期时间部分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
简单 - 可以根据数字生成日期,就像我提供的示例一样。它还意味着使用单个表,而不是每个数据类型一个。
答案 1 :(得分:0)
SELECT COUNT(*),
HOUR(`dPostTime`) AS `hr`
FROM `table`
GROUP BY `hr`
之后,php格式hr
等于'hr - 1' - hr