2011-12-06 147 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的文檔。