Нужна помощь с этим запросом MySQL.Поиск пользователей, которые доступны в определенное время - PullRequest
2 голосов
/ 01 июля 2011

Вот упрощенная схема моей базы данных:

Users
------------------------------------
UserID | Name      | Assignable
------------------------------------
  5    | John Doe  |      1

TimeSlots
-------------------------------------------------------
TimeSlotID | StartTime           | EndTime
-------------------------------------------------------
     3     | 2011-06-30 15:00:00 | 2011-06-30 16:00:00

Appointments
------------------------------------
TimeSlotID | UserID
------------------------------------
     3     |    5   

У меня есть пользователи, которым можно назначать временные интервалы, которые составляют встречи. Мне нужен способ начать с начального и конечного времени и запросить всех пользователей, которые могут быть назначены (флаг назначения назначен на 1) и не имеют временных конфликтов (встреч, которые перекрываются) с этими временами.

Старые временные интервалы также будут там, так что вас будут интересовать только временные интервалы, которые есть сейчас или в будущем.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011
select *
from users u    
where u.Assignable = 1
    and u.UserID not in (
       select UserID
       from Appointments a
         join TimeSlots t on a.TimeSlotID = t.TimeSlotID 
       where t.EndTime > now()
          and t.EndTime > @desiredStartTime
          and t.StartTime < @desiredEndTime
    )

edit Подсказка от tandu

Я думаю, что это также сработает, и это даст дополнительное преимущество в производительности без подзапросов:

select *
from users u    
    left join Appointments a on a.UserID = u.UserID
    left join TimeSlots t on (
    a.TimeSlotID = t.TimeSlotID 
       and t.EndTime > now()
       and t.EndTime > @desiredStartTime
       and t.StartTime < @desiredEndTime
    )
where 
    u.Assignable = 1
    and t.TimeSlotID is null
2 голосов
/ 01 июля 2011

скажем @start - время начала, а @end - время окончания, которое вы передаете в запрос в вашем скрипте:

SELECT
   UserID
FROM
   Users
   NATURAL JOIN Appointments a
   NATURAL JOIN TimeSlots t1
   LEFT JOIN TimeSlots t2 ON (
      a.TimeSlotID = t2.timeSlotID
      AND (
         t2.EndTime BETWEEN @start AND @end
         OR t2.StartTime BETWEEN @start AND @end
         OR @start > t2.StartTime AND @end < t2.EndTime
      )
      AND t2.StartTime > NOW()
   )
WHERE
   Assignable
   AND NOW() < t1.StartTime
   AND t2.TimeSlotID IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...