在MySQL中生成统计信息

时间:2011-12-06 20:21:11

标签: mysql graph

我有一个包含帖子的表格,我希望生成一个图表,显示过去30分钟内发布的帖子数量,以及之前的最后30分钟等。帖子由post_handler和post_status选择。

表结构如下所示。

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'

你知道其他任何解决方案吗?有没有办法在一个查询中运行也将结果插入数据库的查询?

2 个答案:

答案 0 :(得分:1)

In(非常)简短:是的,您可以将查询结果插入另一个表中。在这里查看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 ?

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

答案 1 :(得分: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 ...

有关此内容的更多详细信息,请参阅MySQL文档中的here