Я нашел запрос в вашей скрипке немного сложным для подражания.Но я думаю, что вы хотите вот что:
select *
from planner_events e
join drivers d on d.driver_id=e.user_id
where e.event_start <= @enddate and e.event_end >= @startdate
and e.user_type='driver'
Где @startdate - первый день интересующего вас периода, а @enddate - последняя дата.Если размер диапазона всегда один и тот же, одна неделя или что-то еще, @enddate можно заменить вычислением.
Это должно дать вам список всех драйверов, у которых есть события, которые перекрывают желаемый диапазон дат.Если вам нужны все водители, у которых нет события в этом диапазоне дат, просто отмените проверку даты.
О, и, конечно же, вместо "select *" вы должны перечислить все поля, которые вы используете.на самом деле заинтересован. Я просто ленился там.
Обновление
А, понятно.Вам нужен список тех, кто доступен каждый день, а не только тех, кто доступен где-то в течение недели.
Хорошо, насколько мне известно, для этого вам понадобится таблица с записями для каждого дня.,Существует множество способов создания такой таблицы, я не знаю, как использовать стандартный SQL.Если создание этой таблицы является проблемой, которую мы можем решить, но позвольте мне предположить, что это не так, и что такая таблица существует и называется «рабочими днями», и каждая запись включает поле даты «date1».
Затемзапрос может быть выполнен следующим образом:
select w.date1, d.driver_id, d.driver_name
from workdays w
cross join drivers d
where w.date1 between @start and @end
and not exists (select * from planner_event
where event_start<=w.date1 and event_end>=w.date1 and user_id=d.driver_id and user_type='driver')
order by w.date1, d.driver_id
Это дает набор результатов со списком дат и доступных драйверов, которые затем необходимо будет отформатировать в нужной таблице с кодом.Если вы ищете в наборе результатов по одному столбцу для каждого дня и по одной строке для каждого драйвера или чего-то подобного, я уверен, что мы могли бы это сделать, придется поиграть с этим немного больше.Я думаю, что это был бы беспорядочный запрос с подзапросом на каждый день.
Обновление 2
Ах.Если мы знаем, что период - неделя, то нам не нужен рабочий день.Мы можем сделать это:
select d.driver_id, d.driver_name,
case when exists (select * from planner_events where '2018-12-31' between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Monday,
case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 1 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Tuesday,
case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 2 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Wednesday,
case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 3 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Thursday,
case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 4 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Friday
from drivers d
order by d.driver_id