2017-02-14 2 views
0

У меня есть таблица сотрудников, которые могут работать в нескольких разделах. Однако, как только раздел забронированы на дату/с они не доступны для бронируются в других разделах этой датыMySQL Запрос на доступность сотрудников

таблица Сотрудник Сотрудники

id_resources id_sections EmployeeName Section 
28    25   Mark   Section Two 
28    26   Mark   Section Three 
28    28   Mark   Section Four 
28    29   Mark   Section Five 
28    53   Mark   Section Six 
28    64   Mark   Section Seven 
28    74   Mark   Section Eight 
28    76   Mark   Section Nine 
29    30   Blair   Section One 
29    47   Blair   Section Two 
29    49   Blair   Section Three 
30    82   Sam   Section One 
30    25   Sam   Section Two 
30    28   Sam   Section Three 
30    29   Sam   Section Four 
31    18   David   Section Eleven 
31    19   David   Section One 
31    22   David   Section Two 
31    25   David   Section Three 

Тогда мой стол Бронирование является Заказ

id_resources id_sections startdate enddate 
28     25  2016-09-09 2016-09-09 
28     26  2016-09-20 2016-09-20 
28     28  2016-10-17 2016-10-17 
30     82  2016-10-18 2016-10-18 
30     25  2016-10-28 2016-10-28 
29     30  2016-11-02 2016-11-02 
29     47  2016-11-07 2016-11-07 
29     49  2016-11-01 2016-11-01 
29     58  2017-01-09 2017-01-09 

Так что вопрос у меня становится служащему быть:

А.) не доступны для всех разделов, если один раздел зарезервирован за один день
B.), показывающий сотрудника как доступный, когда выбран диапазон дат и нет заказов для этого диапазона.

я могу получить часть , но не часть B.

Select * 
FROM employees 
LEFT JOIN bookings on employees.id_resources = bookings.id_resources 
WHERE 
    (Select..... and i get lost here 

Снова благодарим за любую помощь!

-Ли

+0

Могу ли я спросить, почему вы используете id_resources вместо id_sections? – FreedomPride

ответ

0

Вы должны попробовать что-то вроде этого:

SELECT employees.* 
FROM employees 
    LEFT OUTER JOIN bookings 
    ON employees.id_resources = bookings.id_resources 
     AND (
     (startdate BETWEEN $start_range AND $end_range) 
     OR 
     (enddate BETWEEN $start_range AND $end_range) 
     ) 
WHERE bookings.id_resources IS NULL 

Краткое объяснение: Мы используем LEFT OUTER JOIN ... WHERE ... IS NULL в качестве исключения. This post может помочь вам

Edit: При использовании LEFT OUTER JOIN в качестве исключения, первого, вы должны думать на противоположной цели. Здесь будет найти пользователя, который имеет бронь между двумя датами. Для этого у вас будет такой запрос:

SELECT employees.* 
FROM employees 
    INNER JOIN bookings 
    ON employees.id_resources = bookings.id_resources 
     AND (startdate BETWEEN $start_range AND $end_range) 
     AND (enddate BETWEEN $start_range AND $end_range) 

Тогда вы делаете обратное.

Смежные вопросы