
lost
21.06.2017
13:14:00
что-нибудь вроде такого

Danil
21.06.2017
13:14:58

r
21.06.2017
13:15:15
ща все будет
падажи

Google

lost
21.06.2017
13:16:32
это какой-то слишком сложный способ

Danil
21.06.2017
13:18:02
в идеале мне нужно чтобы с сервера выдавалась готовая для отображения табличка. сейчас данные тянутся кучей запросов на каждый час

r
21.06.2017
13:18:17

Danil
21.06.2017
13:19:19
да. например период 0:00-1:00 : результат и так далее по каждому часу в течение суток от сейчас
ща кину картинку как это выглядит примерно в конце
таких табличек порядка 10 с разным набором данных
но у всех есть привязка ко времени по часам
я понимаю что в идеале можно забирать гору данных за сутки сразу в софт и парсить уже в памяти, но это тоже имеет свои минусы. готовую табличку можно использовать напрямую в вэбке например или в эксель затащить, что иногда необходимо


r
21.06.2017
13:26:13
составил как понял, разбирайся, эксперементируй, останутся вопросы - задавай
Таблица
CREATE TABLE `tt` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`result1` int(11) DEFAULT NULL,
`result2` int(11) DEFAULT NULL,
`start_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8
Данные
SELECT * FROM tt;
+----+-------+------+---------+---------+---------------------+---------------------+
| id | name | type | result1 | result2 | start_time | end_time |
+----+-------+------+---------+---------+---------------------+---------------------+
| 13 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 14 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 15 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 16 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 17 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 18 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 19 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 20 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 21 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 22 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 23 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 24 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 25 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 26 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 27 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 28 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
+----+-------+------+---------+---------+---------------------+---------------------+
Результат
SELECT SUM(result1) as 'result1', SUM(result2) as 'result 2', DATE_FORMAT(start_time, "%Y-%m-%d %H:00:00") as 'start_time', DATE_FORMAT(end_time, "%Y-%m-%d %H:00:00") as 'end_time' FROM tt WHERE start_time >= STR_TO_DATE(DATE_FORMAT(NOW()-INTERVAL 24 HOUR, "%Y-%m-%d %H:00:00"), '%Y-%m-%d %H:%i:%s') AND end_time <= STR_TO_DATE(DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"), '%Y-%m-%d %H:%i:%s') GROUP BY name;
+---------+----------+---------------------+---------------------+
| result1 | result 2 | start_time | end_time |
+---------+----------+---------------------+---------------------+
| 4 | 4 | 2017-06-21 00:00:00 | 2017-06-21 01:00:00 |
| 4 | 4 | 2017-06-21 01:00:00 | 2017-06-21 02:00:00 |
| 8 | 8 | 2017-06-21 02:00:00 | 2017-06-21 03:00:00 |
+---------+----------+---------------------+---------------------+


lost
21.06.2017
13:26:19
а можно написать 1 запрос с группировкой

r
21.06.2017
13:27:18
запрос не пометсился

lost
21.06.2017
13:27:47
кстати можно без str_to_date юзать, мускуль и так схавает

Google

r
21.06.2017
13:27:53


Danil
21.06.2017
13:29:06
составил как понял, разбирайся, эксперементируй, останутся вопросы - задавай
Таблица
CREATE TABLE `tt` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`result1` int(11) DEFAULT NULL,
`result2` int(11) DEFAULT NULL,
`start_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8
Данные
SELECT * FROM tt;
+----+-------+------+---------+---------+---------------------+---------------------+
| id | name | type | result1 | result2 | start_time | end_time |
+----+-------+------+---------+---------+---------------------+---------------------+
| 13 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 14 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 15 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 16 | name | type | 1 | 1 | 2017-06-21 00:00:00 | 2017-06-21 01:01:01 |
| 17 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 18 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 19 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 20 | name2 | type | 1 | 1 | 2017-06-21 01:02:03 | 2017-06-21 02:03:04 |
| 21 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 22 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 23 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 24 | name3 | type | 1 | 1 | 2017-06-21 02:03:04 | 2017-06-21 03:04:05 |
| 25 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 26 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 27 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
| 28 | name3 | type | 1 | 1 | 2017-06-21 03:04:05 | 2017-06-21 06:07:08 |
+----+-------+------+---------+---------+---------------------+---------------------+
Результат
SELECT SUM(result1) as 'result1', SUM(result2) as 'result 2', DATE_FORMAT(start_time, "%Y-%m-%d %H:00:00") as 'start_time', DATE_FORMAT(end_time, "%Y-%m-%d %H:00:00") as 'end_time' FROM tt WHERE start_time >= STR_TO_DATE(DATE_FORMAT(NOW()-INTERVAL 24 HOUR, "%Y-%m-%d %H:00:00"), '%Y-%m-%d %H:%i:%s') AND end_time <= STR_TO_DATE(DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"), '%Y-%m-%d %H:%i:%s') GROUP BY name;
+---------+----------+---------------------+---------------------+
| result1 | result 2 | start_time | end_time |
+---------+----------+---------------------+---------------------+
| 4 | 4 | 2017-06-21 00:00:00 | 2017-06-21 01:00:00 |
| 4 | 4 | 2017-06-21 01:00:00 | 2017-06-21 02:00:00 |
| 8 | 8 | 2017-06-21 02:00:00 | 2017-06-21 03:00:00 |
+---------+----------+---------------------+---------------------+
чувак ты походу гений! спасибо!


r
21.06.2017
13:29:20
и без стр2дате
SELECT SUM(result1) as 'result1', SUM(result2) as 'result 2', DATE_FORMAT(start_time, "%Y-%m-%d %H:00:00") as 'start_time', DATE_FORMAT(end_time, "%Y-%m-%d %H:00:00") as 'end_time' FROM tt WHERE start_time >= DATE_FORMAT(NOW()-INTERVAL 24 HOUR, "%Y-%m-%d %H:00:00") AND end_time <= DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00") GROUP BY name;
+---------+----------+---------------------+---------------------+
| result1 | result 2 | start_time | end_time |
+---------+----------+---------------------+---------------------+
| 4 | 4 | 2017-06-21 00:00:00 | 2017-06-21 01:00:00 |
| 4 | 4 | 2017-06-21 01:00:00 | 2017-06-21 02:00:00 |
| 8 | 8 | 2017-06-21 02:00:00 | 2017-06-21 03:00:00 |
+---------+----------+---------------------+---------------------+

Danil
21.06.2017
13:29:48
я бы сам такое не осилил. буду курить магию подсчета времени в запросе

lost
21.06.2017
13:30:08
да и без date_format в where тоже... но это уже мелочи

r
21.06.2017
13:30:33
а данные в datetime
если знаешь как так сделать, напиши

lost
21.06.2017
13:32:09
ща

Danil
21.06.2017
13:33:57
я чего то не могу понять как разбивается результат по часам ((
или запись %Y-%m-%d %H:00:00 означает любой час с 00 минут 00 секунд?

r
21.06.2017
13:35:41
да

Danil
21.06.2017
13:36:18
типа регулярного выражения? а че так можно? ??

r
21.06.2017
13:36:26
это формат всего лишь
на вход подаешь датувремя, возвращает ту же дату + час
остальные нули
но регуляреные выражения тоже есть)

Google

r
21.06.2017
13:38:03

Danil
21.06.2017
13:38:04
подожди, а как тогда происходит итерация по часам?

r
21.06.2017
13:38:29
не совсем понял

Danil
21.06.2017
13:39:34
ну в результате получаем искомую таблицу. т. е. мускул сам пробегает весь период за 24 часа и группмрует данные по шаблону времени?
так правильно?
я просто весьма начинающий в БД, учусь для себя, ну и самый лучший вариант когда есть реальная задача и реальные сроки.
это не основная работа вообще))


r
21.06.2017
13:41:40
да, типа того
Потренеруся на этом запросе
SELECT CONCAT('WHERE start_time >= "',DATE_FORMAT(NOW()-INTERVAL 24 HOUR, "%Y-%m-%d %H:00:00"), ' AND end_time <= "', DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00"),'"') as 'where';
Просто выполни его и все
+--------------------------------------------------------------------------------+
| where |
+--------------------------------------------------------------------------------+
| WHERE start_time >= "2017-06-20 16:00:00 AND end_time <= "2017-06-21 16:00:00" |
+--------------------------------------------------------------------------------+
Результат примерно такой
так, в том запросе еще нужно сгруппировать по start,end
SELECT SUM(result1) as 'result1', SUM(result2) as 'result 2', DATE_FORMAT(start_time, "%Y-%m-%d %H:00:00") as 'start_time', DATE_FORMAT(end_time, "%Y-%m-%d %H:00:00") as 'end_time' FROM tt WHERE start_time >= DATE_FORMAT(NOW()-INTERVAL 24 HOUR, "%Y-%m-%d %H:00:00") AND end_time <= DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00") GROUP BY name,start_time,end_time;
+---------+----------+---------------------+---------------------+
| result1 | result 2 | start_time | end_time |
+---------+----------+---------------------+---------------------+
| 4 | 4 | 2017-06-21 00:00:00 | 2017-06-21 01:00:00 |
| 4 | 4 | 2017-06-21 01:00:00 | 2017-06-21 02:00:00 |
| 4 | 4 | 2017-06-21 02:00:00 | 2017-06-21 03:00:00 |
| 4 | 4 | 2017-06-21 03:00:00 | 2017-06-21 06:00:00 |
+---------+----------+---------------------+---------------------+


Danil
21.06.2017
13:44:44
большое тебе человеческое спасибо! вечером доберусь до сервера, покурю на реалных данных

lost
21.06.2017
13:45:16
SELECT
SUM(result) AS result, DATE_FORMAT(start_time, '%Y-%m-%d %H:00:00 - %Y-%m-%d %H:59:59') AS dt, HOUR(dt)
FROM fooo
WHERE dt BETWEEN NOW() - INTERVAL 24 HOUR AND NOW()
GROUP BY 3;
чет как-то ну слишком сложно

r
21.06.2017
13:45:32
Но на самом деле я думаю, что тебе нужно искать все, таки вплоть до секунд, а выводить в часах и группировать по часам

Google

r
21.06.2017
13:50:22
@RT_1_98
В общем информации накидали предостаточно, юзай

Danil
21.06.2017
13:55:41
???

lost
21.06.2017
13:57:00
да, все верно

Danil
21.06.2017
13:57:18
офигенно просто

lost
21.06.2017
13:57:23
можно явно указывать в group by по чем будешь группировать, а можешь написать это в SELECT и указать номер колонки
в запросе ошибку допустил синтаксическую, вместо > должен быть between

Danil
21.06.2017
14:01:10
ок, исправим

r
21.06.2017
14:02:27

lost
21.06.2017
14:02:44
ну оно будет работаь, только неверно

r
21.06.2017
14:02:51
но думаю что крайний AND воспринимает тупо как тру
да

lost
21.06.2017
14:03:03

Danil
21.06.2017
14:03:21
ну формально да, условие то все равное правильное в моем контексте
позже чем сейчас данных все равно не бывает. А кстати на машину времени можно поставить MySQL? ??

lost
21.06.2017
14:04:45

Dmitry
21.06.2017
14:21:17
https://www.percona.com/resources/webinars/deploying-mysql-production
вот вам вебинарчик

Danil
21.06.2017
14:39:27
SORT BY dt ASC?

Google

Danil
21.06.2017
14:41:52
т. е. ORDER?

lost
21.06.2017
14:52:55
нуу, да, указать колонки для сортировки после order by
плюс group by сам сортирует по колонкам, которые определены в группировке

Danil
21.06.2017
14:54:52
ну вот после group by и получился неверный порядок времени. order by помог
а вью остается навсегда после создания и к нему можно обращаться потом как к обычной таблице?

lost
21.06.2017
14:57:17
да

Danil
21.06.2017
14:59:48
а можно из результата запроса исключить вывод HOUR(dt) но использовать его?

lost
21.06.2017
15:00:18
можно HOUR(dt) перенести в группировку
ну или поместить это запрос во вьюху и вывести не все колонки


Danil
21.06.2017
15:01:18
т. е. просто убрать его просто так нельзя?
ругается, что у запроса и вью несовпадает количество столбцов
и ещё dt выводится как диапазон. как получить только время начала часа?
т. е. вместо '2017-06-21 13:00:00 - 2017-06-21 13:59:59' получить только '2017-06-21 13:00:00'
и ещё у вью форматы полей для времени varchar() а не datetime - это можно изменить? ибо запрос к вью с выборкой по времени работает с ним как с текстом
извините за кучу тупых вопросов, но я даже не знаю как это правильно загуглить
ещё вот проблема - например сейчас 18:40 и в базе уже есть записи за час с 18:00:00 до 18:59:59 - в результате запроса последние данные только за прошлый час т. е. 17:00:00~17:59:59
пробовал поменять время NOW() на NOW()+INTERVAL 1 HOUR - чего то не сработало
похоже мой косяк. все работает корректно для текущего часа. но только если сумма не 0! А как получить и записи если сумма = 0?
нагуглил COALESCE это оно?
что-то не работает оно


lost
21.06.2017
15:47:02
coalesce это для другого