我有一个包含帖子的表格,我希望生成一个图表,显示过去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'
你知道其他任何解决方案吗?有没有办法在一个查询中运行也将结果插入数据库的查询?
答案 0 :(得分:1)
In(非常)简短:是的,您可以将查询结果插入另一个表中。在这里查看INSERT ... SELECT
:http://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查询工具运行此命令以查看输出。你可以添加数学上的区别,也可以使用CASE
或IF
等,但我个人或者按小时或分钟分组只是为了让SQL部分更容易。
要将这些数字直接添加到图表数据库中,请使用以下语法:
INSERT INTO yourtable (yourfields)
SELECT ...
有关此内容的更多详细信息,请参阅MySQL文档中的here。