Выборка по дате - 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 года). Результатом будет список уникальных идентификаторов экскурсий.

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


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

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

9   голосов , оценка 3.889 из 5