Генерация статистики в MySQL - PullRequest
       0

Генерация статистики в MySQL

0 голосов
/ 07 декабря 2011

У меня есть таблица с сообщениями, и я хочу сгенерировать график, который показывает, сколько сообщений было сделано за последние 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 ]

1 голос
/ 07 декабря 2011

Довольно легко сгруппировать по отличительным параметрам времени, таким как часы, минуты, день или что-то еще. Если вы хотите сгруппировать это по часам, возможный запрос может выглядеть так:

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.

1 голос
/ 07 декабря 2011

Вкратце (очень): да, вы можете вставить результаты запроса в другую таблицу.Взгляните на 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 ?

, а затем заполните четыре ? s.с теми же двумя DATETIME с, повторяется.($from, $to, $from, $to)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...