2011-12-06 50 views
0

我有一个包含帖子的表格,我想要生成一个图表,显示过去最后30分钟内有多少帖子,以及最近30分钟之前发布的帖子等。帖子由其post_handler post_status。在MySQL中生成统计信息

表结构看起来像这样。

CREATE TABLE IF NOT EXISTS `posts` (
    `post_title` varchar(255) NOT NULL, 
    `post_content` text NOT NULL, 
    `post_date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `post_handler` varchar(255) NOT NULL, 
    `post_status` tinyint(4) NOT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
    KEY `post_status` (`post_status`), 
    KEY `post_status_2` (`post_status`,`id`), 
    KEY `post_handler` (`post_handler`), 
    KEY `post_date_added` (`post_date_added`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2300131 ; 

我希望收到的结果,按post_date_added排序。

period_start period_end posts 
2011-12-06 19:23:44 2011-12-06 19:53:44 10 
2011-12-06 19:53:44 2011-12-06 20:23:44 39 
2011-12-06 20:23:44 2011-12-06 20:53:44 40 

现在,我使用的解决方案,我有很多次,运行此查询,然后将数据插入到从PHP脚本另一个表。

SELECT COUNT(*) FROM posts WHERE post_handler = 'test' AND post_status = 1 AND post_date_added BETWEEN '2011-12-06 19:23:44' AND '2011-12-06 19:53:44' 

您是否知道其他解决方案?有没有办法运行一个查询,也将结果插入到数据库中,全部在一个查询中?

回答

1

非常简短:是的,您可以将查询结果插入到另一个表中。看看这里INSERT ... SELECThttp://dev.mysql.com/doc/refman/5.1/en/insert-select.html

从本质上讲,你只需要改变你有什么喜欢的东西

INSERT INTO post_statistics_table (period_start, period_end, posts) 
    SELECT ?, ?, COUNT(*) FROM posts 
     WHERE post_handler = 'test' 
      AND post_status = 1 
      AND post_date_added BETWEEN ? AND ? 

,然后在四个? s的相同的两个DATETIME个饱,重复。 ($from, $to, $from, $to)

1

它很容易通过独特的时间参数进行分组,例如小时,分钟,日期等等。如果你想这组由一个小时,一个可能的查询可能是这样的:

SELECT DATE_FORMAT(post_date_added,"%Y-%m-%d %H") AS "_Date", 
    COUNT(*) 
FROM posts 
WHERE post_handler = 'test' 
    AND post_status = 1 
GROUP BY _Date; 

(与您选择的MySQL查询工具运行此查看输出)。

但是,如果你想考虑30分钟作为你的组的基础,SQL部分将变得更加棘手。再次

SELECT DATE_FORMAT(post_date_added,"%Y-%m-%d %H") AS "_Date", 
    "00" AS "semihour", 
    COUNT(*) 
FROM posts 
WHERE post_handler = 'test' 
    AND DATE_FORMAT(post_date_added,"%i") < 30 
    AND post_status = 1 
GROUP BY _Date 
UNION 
SELECT DATE_FORMAT(post_date_added,"%Y-%m-%d %H") AS "_Date", 
    "30" AS "semihour", 
    COUNT(*) 
FROM posts 
WHERE post_handler = 'test' 
    AND DATE_FORMAT(post_date_added,"%i") >= 30 
    AND post_status = 1 
GROUP BY _Date; 

,与您所选择查看输出的MySQL查询工具运行此:为了这个特殊目的,因为你只需要分成两个不同的子集,也许这种方法工作。你可以在这里添加数学上的区别,CASEIF等等,但是我个人可以按小时或分组来分组,只是为了让SQL部分更容易。

要直接添加这些数字到您的图形数据库,使用此语法:

INSERT INTO yourtable (yourfields) 
SELECT ... 

更多关于这个细节,可以发现here MySQL的文档。