Сложный запрос к одной таблице - 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(