Выборка по дате - MySQL
Формулировка задачи:
Приветствую, ув. сообщество.
До последнего ломал голову над задачей, в итоге решил написать сюда.
Суть:
- На сайте делать выборку экскурсий по дате от и до.
Что имею:
- MySQL (на Postgresql перейти не вариант)
- Сайт с экскурсиями. Каждая экскурсия может иметь неограниченное количество дней её начала (день окончания экскурсии не так важен)
- Таблица excursions. Содержит поле dates с типом text.
- При создании экскурсии в dates через запятую вносятся дни в формате Y-m-d
Пример данных в БД:
- Экскурсия 1 (dates содержит 2018-05-06, 2018-05-07, 2018-06-01, 2018-06-07)
- Экскурсия 2 (dates содержит 2018-05-07, 2018-05-08, 2018-05-20, 2018-06-25)
- Экскурсия 3 (dates содержит 2018-05-10, 2018-05-15)
Задача:
- Надо сделать выборку экскурсий по выбранной пользователем дате от и до.
Пример действий пользователя:
- Пользователь выбирает диапазон с 2018-05-01 по 2018-05-08. Результат должен быть: Экскурсия 1, Экскурсия 2
- Пользователь выбирает диапазон с 2018-05-01 по 2018-06-01. Результат должен быть: Экскурсия 1, Экскурсия 2, Экскурсия 3
- Пользователь выбирает диапазон с 2018-06-01 по 2018-06-05. Результат должен быть: Экскурсия 1
и т.д.
Что предпринимал:
- В 5 утра возникла мысль, создавать доп. поля date_first (первая дата в экскурсии) и date_last (последняя дата в экскурсии). Затем делать выборку по этим полям. Вроде заработало, но на следующий день понял, что это не то.
- Сегодня возникла мысль создать отдельную таблицу, куда делать записи вида `excursion_id`, `date`. Делать выборку по ней, потом "подключать" таблицу `excursions`. Однако сразу встал вопрос в правильном запросе. Не хотелось бы делать where `дата` and where`дата` и т.д.
Может кто подскажет, как сделать правильно?
Буду примного благодарен хотя бы за правильные мысли и еще благодарнее за пример SQL запроса
P.S. К таблице уже есть join на категорию, пользователи, 2 подзапроса в select на получение данных категории. Не хотелось бы сильно перегружать запрос.
Решение задачи: «Выборка по дате»
textual
Листинг программы
SELECT `e`.`name` FROM `excursion` `e` INNER JOIN `excursion_dates` `ed` ON (`ed`.`excursion_id` = `e`.`excursion_id`) WHERE `ed`.`excursion_date` BETWEEN '2018-05-02' AND '2018-05-08' GROUP BY `e`.`excursion_id`
Объяснение кода листинга программы
Код написан на SQL и выполняет следующую задачу: выборка из таблицы excursion
всех записей, которые имеют соответствующие записи в таблице excursion_dates
с датами в заданном диапазоне (с 2 мая 2018 года по 8 мая 2018 года). Результатом будет список уникальных идентификаторов экскурсий.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д