Задать вопрос
@aljo222
В процессе обучения веб-разработке

Как запросом проверить входит ли дата из списка в диапазон дат?

Как запросом проверить входит ли дата из списка в диапазон дат?
таблица
639881a81bdd8116117585.jpeg
В столбце dates через запятую указаны даты, в которые будет проводиться мероприятие. На сайте в фильтре задается диапазон дат От-До в таком же формате, как и в таблице (d-m-Y).
Как запросом получить записи, у которых хотя бы одна дата входит в этот диапазон?
  • Вопрос задан
  • 299 просмотров
Подписаться 3 Простой 8 комментариев
Решения вопроса 1
@alexalexes
Выносите даты в отдельную таблицу:
Название таблицы: location_event_dates
id - идентификатор даты;
location_event_id - идентификатор из таблицы location_event (то, что у вас в вопросе)
event_date - одна из дат события (в формате даты, а не строки!)
Тогда будет нормальный поиск:
select le.id, le.locationid, le.eventid,
          led.event_date
from location_event le
join location_event_dates led on led.location_event_id = le.id
where led.event_date between :begin_date and :end_date
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для MySQL 8 можно, но запрос страшненький
WITH RECURSIVE `cte` AS (
  (SELECT `id`, `locationid`, `eventid`,
          TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(`list`, ','), ',', 1), ',', -1)) AS `date`,
          1 AS `idx`
    FROM `test`
    HAVING `date` != '')
  UNION
  (SELECT `t`.`id`, `t`.`locationid`, `t`.`eventid`,
          TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(`t`.`list`, ','), ',', `cte`.`idx` + 1), ',', -1)) AS `date`,
          `cte`.`idx` + 1
     FROM `cte`
     JOIN `test` AS `t` ON `t`.`id` = `cte`.`id`
     HAVING `date` != '')
),
SELECT `id`, `locationid`, `eventid`, 
       CONCAT (SUBSTRING(`date`, 7, 4), '-', SUBSTRING(`date`, 4, 2), '-', SUBSTRING(`date`, 1, 2)) AS `date`
  FROM `cte`
  HAVING `date` >= :firstDate AND `date` < :lastDate

Лучше один раз потратить время и нормализовать таблицу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы