2017-02-14 47 views
0

我有一张可以在多个部分工作的员工表。但是,一旦一个部分是徒劳的,日期/秒,他们是不可用于在其他部分预订该日期MySQL查询员工的可用性

Employee表是员工

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 

所以我有问题越来越雇员是:

A.)不适用于所有部门,如果某一部分预订了一天
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可以帮助你

编辑:当您使用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) 

然后你做相反的。