Сложный запрос к одной таблице - MySQL
Формулировка задачи:
Прошу дать ориентир по выбору решения составления нужного запроса.
вообщем есть лог база работы целого комплекса камер. так вот камера когда отваливается от сети в лог базу вноситься запись: камера name, его id, datetime, и признак detach.
соответственно когда связь восстанавливается с камерой вноситься в эту же базу запись:
камера name, его id, datetime, и признак atach.
вот лог база
необходимо сделать выборку камер у которых время между разрывам и соединением более 5 минут.
"215";"Локомотив3:Назад";"ATTACH";"2017-06-30 12:41:50.858";"2017-06-30 12:41:59.671";"S-CHOP5" |
"213";"Локомотив3:Правый борт";"ATTACH";"2017-06-30 12:41:49.953";"2017-06-30 12:41:59.618";"S-CHOP5" |
"213";"Локомотив3:Правый борт";"DETACH";"2017-06-30 12:41:44.228";"2017-06-30 12:41:53.962";"S-CHOP5" |
"35";"Периметр:Автостоянка:КПП1_2";"ATTACH";"2017-06-30 12:41:43.861";"2017-06-30 12:41:43.978";"S-CHOP2" |
"174";"Территория:СМС УБ:Выезд";"ATTACH";"2017-06-30 12:41:43.671";"2017-06-30 12:41:43.912";"S-CHOP4" |
"215";"Локомотив3:Назад";"DETACH";"2017-06-30 12:41:43.214";"2017-06-30 12:41:51.851";"S-CHOP5" |
"35";"Периметр:Автостоянка:КПП1_2";"DETACH";"2017-06-30 12:41:42.82";"2017-06-30 12:41:42.835";"S-CHOP2" |
"174";"Территория:СМС УБ:Выезд";"DETACH";"2017-06-30 12:41:38.092";"2017-06-30 12:41:38.224";"S-CHOP4" |
Решение задачи: «Сложный запрос к одной таблице»
textual
Листинг программы
SELECT d.CamId, d.Moment, MIN(a.Moment) FROM log d LEFT JOIN log a ON d.CamId = a.CamId AND a.Moment > d.Moment WHERE d.action = 'DETACH' GROUP BY d.CamId, d.Moment HAVING MIN(a.Moment) IS NULL OR DATEDIF(min, d.Moment, MIN(a.Moment)) > 5
Объяснение кода листинга программы
Код написан на SQL и выполняет следующую задачу:
- Выбирает из таблицы
log
поляCamId
,Moment
и MIN(Moment
) из таблицыlog
(возможно, из другой таблицы, но в данном контексте не важно. - Использует оператор
LEFT JOIN
для объединения таблицыlog
саму с собой по полямCamId
иMoment
(второй таблицей, с которой происходит объединение, является та же таблицаlog
). - Фильтрует результаты с помощью оператора
WHERE
по условию, что полеaction
равно 'DETACH'. - Группирует результаты по полям
CamId
иMoment
с помощью оператораGROUP BY
. - Использует оператор
HAVING
для фильтрации результатов группировки. Фильтр состоит из двух условий:- MIN(
Moment
) IS NULL - выбираются только те записи, для которых не найдено меньшее значениеMoment
в объединенной таблице. - DATEDIF(min,
d.Moment
, MIN(a.Moment
)) > 5 - выбираются только те записи, для которых разница междуd.Moment
и MIN(a.Moment
) больше 5 минут.
- MIN(
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д