Сложный запрос к одной таблице - MySQL

Узнай цену своей работы

Формулировка задачи:

Прошу дать ориентир по выбору решения составления нужного запроса. вообщем есть лог база работы целого комплекса камер. так вот камера когда отваливается от сети в лог базу вноситься запись: камера name, его id, datetime, и признак detach. соответственно когда связь восстанавливается с камерой вноситься в эту же базу запись: камера name, его id, datetime, и признак atach. вот лог база
"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"
необходимо сделать выборку камер у которых время между разрывам и соединением более 5 минут.

Решение задачи: «Сложный запрос к одной таблице»

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 и выполняет следующую задачу:

  1. Выбирает из таблицы log поля CamId, Moment и MIN(Moment) из таблицы log (возможно, из другой таблицы, но в данном контексте не важно.
  2. Использует оператор LEFT JOIN для объединения таблицы log саму с собой по полям CamId и Moment (второй таблицей, с которой происходит объединение, является та же таблица log).
  3. Фильтрует результаты с помощью оператора WHERE по условию, что поле action равно 'DETACH'.
  4. Группирует результаты по полям CamId и Moment с помощью оператора GROUP BY.
  5. Использует оператор HAVING для фильтрации результатов группировки. Фильтр состоит из двух условий:
    • MIN(Moment) IS NULL - выбираются только те записи, для которых не найдено меньшее значение Moment в объединенной таблице.
    • DATEDIF(min, d.Moment, MIN(a.Moment)) > 5 - выбираются только те записи, для которых разница между d.Moment и MIN(a.Moment) больше 5 минут.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5