Эй, я наткнулся на этот сайт в поисках решений для перекрытия событий в таблицах mySQL. Я был так впечатлен решением (которое уже помогает), я думал, что увижу, смогу ли я получить какую-то помощь ...
Хорошо, значит, Джо хочет поменяться сменой с кем-то на работе. У него свидание в суде. Он переходит к форме смены, и она подтягивает график этой недели (или то, что от него осталось). Это делается с помощью запроса к БД. Нет пота. Он выбирает смену. С этого момента становится колюче.
Итак, сначала форма передает начало и конец смены сценарию. Он запускает запрос для всех, кто имеет смену, которая перекрывает эту смену. Они не могут работать в две смены одновременно, поэтому все идентификаторы пользователей из этого запроса заносятся в черный список. Этот запрос выглядит так:
SELECT DISTINCT user_id FROM shifts
WHERE
FROM_UNIXTIME('$swap_shift_start') < shiftend
AND FROM_UNIXTIME('$swap_shift_end') > shiftstart
Затем мы выполняем запрос для всех смен, которые а) имеют одинаковую длину (политика компании) и б) не перекрываются с другими сменами, с которыми работает Джо.
То, что у меня сейчас есть, выглядит примерно так:
SELECT *
FROM shifts
AND shiftstart BETWEEN FROM_UNIXTIME('$startday') AND FROM_UNIXTIME('$endday')
AND user_id NOT IN ($busy_users)
AND (TIME_TO_SEC(TIMEDIFF(shiftend,shiftstart)) = '$swap_shift_length')
$conflict_dates
ORDER BY shiftstart, lastname
Теперь вы, вероятно, задаетесь вопросом "что такое $ threat_dates ???"
Что ж, когда Джо передает сменную смену, он перезагружает свои смены на неделю, если он решает проверить потенциал другой смены. Поэтому, когда он выполняет этот первый запрос, в то время как скрипт просматривает и выводит свой выбор, он также создает строку, которая выглядит примерно так:
AND NOT(
'joe_shift1_start' < shiftend
AND 'joe_shift1_end' > shiftstart)
AND NOT(
'joe_shift2_start' < shiftend
AND 'joe_shift2_end' > shiftstart)
...etc
Так что база данных получает довольно длинный запрос в следующем формате:
SELECT *
FROM shifts
AND shiftstart BETWEEN FROM_UNIXTIME('$startday') AND FROM_UNIXTIME('$endday')
AND user_id NOT IN ('blacklisteduser1', 'blacklisteduser2',...etc)
AND (TIME_TO_SEC(TIMEDIFF(shiftend,shiftstart)) = '$swap_shift_length')
AND NOT(
'joe_shift1_start' < shiftend
AND 'joe_shift1_end' > shiftstart)
AND NOT(
'joe_shift2_start' < shiftend
AND 'joe_shift2_end' > shiftstart)
AND NOT(
'joe_shift3_start' < shiftend
AND 'joe_shift3_end' > shiftstart)
AND NOT(
'joe_shift4_start' < shiftend
AND 'joe_shift4_end' > shiftstart)
...etc
ORDER BY shiftstart, lastname
Итак, я надеюсь, что либо у SQL есть какой-то гениальный способ справиться с этим более простым способом, либо кто-то может указать на фантастический логический принцип, который объясняет потенциальные конфликты гораздо умнее. (Обратите внимание на использование 'start> end, end
Спасибо!
A