@mysql_ru

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

Danil
21.06.2017
13:14:58
можно и во вьюхе сделать привязку к последним 24 часам, но тогда придется тянуть лишние данные
пока я думаю, что смогу сформировать запросы для вью на каждый час с обрезкой минут и секунд. потом собрать из них вью за сутки. с процедурами будет все то же самое + как их вызывать с клиента я не знаю

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

падажи

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

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

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
Но на самом деле я думаю, что тебе нужно искать все, таки вплоть до секунд, а выводить в часах и группировать по часам

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;
»dt > NOW() - INTERVAL 24 HOUR AND NOW() вот такую запись кстати никогда не использовали, возьму на заметку

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

Danil
21.06.2017
13:55:41
???

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;
я правильно понял что в выборку добавляется значение часа из dt и по нему делается группировка? 3 это порядковый номер параметра?

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
ок, исправим

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

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

да

Danil
21.06.2017
14:03:21
ну формально да, условие то все равное правильное в моем контексте

позже чем сейчас данных все равно не бывает. А кстати на машину времени можно поставить MySQL? ??

Dmitry
21.06.2017
14:21:17
https://www.percona.com/resources/webinars/deploying-mysql-production

вот вам вебинарчик

Danil
21.06.2017
14:39:27
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;
а как добавить сортировку результата по времени с учетом даты и часа, а то сейчас идет с 0:00 до сечас, потом вчерашний день

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 это для другого

Страница 29 из 142