2017-06-18 127 views
1

我正在使用每日日历的预约软件。我有四个表如下:SQL Statement/Codeigniter预约

Services: 
ID | EmployeeID| ServiceID| RoomID| StartDate  | EndDate 
1 |  1  |  1 | 2 | 2017-06-18 01:00 |2017-06-18 02:00 
2 |  2  |  1 | 1 | 2017-06-18 03:00 |2017-06-18 04:00 

Employees: 
EmployeeID | Name 
    1  | A 
    2  | B 
    3  | C 

Rooms: 
RoomID | Name 
    1 | X 
    2 | Y 
    3 | Z 

EmpBreaks: 
ID | EmployeeID | BreakStart  | BreakEnd 
1 |  1  | 2017-06-18 02:00 | 2017-06-18 03:00 

凡服务表存储预订的约会细节,雇员表包含了所有员工的列表,客房表包含了所有房间的列表,以及EmpBreaks存储所有时间当雇员不可用时。

我想执行一个查询来搜索指定开始日期和结束日期的所有可用员工和房间。

例如:

开始日期 '2017年6月18日01:30'
结束日期 '2017年6月18日02:30'

结果:

雇员{3- }

RoomID {1,3}

在这里被更新的工作代码。

function check_available_rooms_therapists() { 
     $this->data['message'] = array(); 
     $this->data['success'] = FALSE; 

    $post = $this->input->post(); 

    $EmployeeFields = array(
     'Employees.EmployeeID', 
     'Employees.Name' 
    ); 

    $sDate = $post['StartDate']; 
    $eDate = $post['EndDate']; 

    $whereEmp = "Employees.EmployeeID NOT IN (SELECT Services.EmployeeID FROM Services where 
     (('" . $sDate . "' BETWEEN Services.StartDate AND Services.EndDate) or 
     ('" . $eDate . "' BETWEEN Services.StartDate AND Services.EndDate) or 
     (Services.StartDate BETWEEN '". $sDate ."' AND '" . $eDate ."') or 
     (Services.EndDate BETWEEN '". $sDate ."' AND '" . $eDate ."')) union 
     (SELECT EMPBREAKS.EMPID FROM EMPBREAKS WHERE(
     ('" . $sDate . "' BETWEEN EMPBREAKS.StartB AND EMPBREAKS.EndB) or 
     ('" . $eDate . "' BETWEEN EMPBREAKS.StartB AND EMPBREAKS.EndB) or 
     (EMPBREAKS.StartB BETWEEN '" . $eDate . "' AND '" . $sDate ."') or 
     (EMPBREAKS.EndB BETWEEN '" . $eDate . "' AND '" . $sDate ."'))))"; 

    $this->db->select($EmployeeFields); 
    $listing = $this->db->get_where('Employees', $whereEmp, 50 , 0); 
    $result = $listing -> result(); 

    $avEmpName = array(); 
    $avEmpID = array(); 

    foreach ($result as $row) { 
     $avEmpID[] = $row->EmployeeID; 
     $avEmpName[] = $row->Name; 
    } 

    $RoomFields = array(
     'Rooms.RoomID', 
     'Rooms.Name' 
    ); 

    $whereRoom = "Rooms.RoomID not in (SELECT Services.RoomID FROM Services WHERE 
     ((Services.startdate BETWEEN '" . $sDate . "' AND '" . $eDate. "') OR 
      (Services.enddate BETWEEN '" . $sDate . "' AND '" . $eDate. "') OR 
      ('" .$sDate . "' BETWEEN Services.startdate AND Services.enddate) OR 
      ('" .$eDate . "' BETWEEN Services.startdate AND Services.enddate)))"; 

    $this->db->select($RoomFields); 
    // $this->db->from('Rooms'); 
    $Rooms = $this->db->get_where('Rooms', $whereRoom, 50 ,0); 
    $Rresult = $Rooms -> result(); 

    $avRoomName = array(); 
    $avRoomID = array(); 

    foreach ($Rresult as $r) { 
     $avRoomID[] = $r->RoomID; 
     $avRoomName[] = $r->Name; 
    } 

     $this->data['EmployeeID'] = $avEmpID; 
     $this->data['RoomID'] = $avRoomID; 
     $this->data['RoomName'] = $avRoomName; 
     $this->data['Name'] = $avEmpName; 

    $this->data['success'] = TRUE; 
    echo json_encode($this->data); 
    die; 
} 
+0

编辑你的问题,并提供样本数据和预期的结果。 –

回答

0

也许你可以在两个不同的查询,轻松地分割你的问题,

首先,你可以编写一个查询谁是匹配你要排除一切, 姑且称之为错误的结果, 后你可以得到所有的员工和房间从员工客房表谁是错误的结果

select * from Employees 
where Employees.EmployeeID not in (
SELECT a.EmployeeID 
    FROM Appointments a 
    where ((a.startdate BETWEEN yourstartdate AND yourenddate) or (a.enddate BETWEEN yourstartdate AND yourenddate))); 

select * from Rooms 
where Rooms.RoomID not in (
    SELECT a.RoomID 
    FROM Appointments a 
    where ((a.startdate BETWEEN yourstartdate AND yourenddate) or (a.enddate BETWEEN yourstartdate AND yourenddate))); 
+0

看来我没有清楚地解释我的问题。我已经更新了我的问题。我希望现在很清楚。 –

+0

完美。正是我想要的。谢谢 –

+0

不用客气,对不起,昨天在编辑之前有点难以理解你的问题!另一个建议你可以在子查询中使用** DISTINCT ** – Frank

0

工作SQL语句:

SELECT `Employees`.`EmployeeID`, `Employees`.`Name` 
FROM (`Employees`) 
WHERE `Employees`.`EmployeeID` NOT IN (SELECT Services.EmployeeID FROM Services where 
((yourstartdate BETWEEN Services.StartDate AND Services.EndDate) or 
(yourenddate BETWEEN Services.StartDate AND Services.EndDate) or 
(Services.StartDate BETWEEN yourstartdate AND yourenddate) or 
(Services.EndDate BETWEEN yourstartdate AND yourenddate)) union 
(SELECT EMPBREAKS.EMPID FROM EMPBREAKS WHERE(
(yourstartdate BETWEEN EMPBREAKS.StartB AND EMPBREAKS.EndB) or 
(yourenddate BETWEEN EMPBREAKS.StartB AND EMPBREAKS.EndB) or 
(EMPBREAKS.StartB BETWEEN yourenddate AND yourstartdate) or 
(EMPBREAKS.EndB BETWEEN yourenddate AND yourstartdate)))) 

SELECT `Rooms`.`RoomID`, `Rooms`.`Name` 
FROM (`Rooms`) 
WHERE `Rooms`.`RoomID` not in (SELECT Services.RoomID FROM Services WHERE 
((Services.startdate BETWEEN 'yourstartdate AND yourenddate) OR 
(Services.enddate BETWEEN 'yourstartdate AND yourenddate) OR 
('yourstartdate BETWEEN Services.startdate AND Services.enddate) OR 
(yourenddate BETWEEN Services.startdate AND Services.enddate)))