2014-09-19 3 views
0

У меня проблема с использованием левого соединения для моих 3 таблиц. У меня есть таблица сотрудников, таблица посещаемости и оставить таблицуmysql query left join three tables, отображающий все данные

У меня есть таблица работника

сотрудник

employee_id | employee_name 
    1  | George 

посещаемость

employee_id | date 
     1  | 2014-01-02 
     1  | 2014-01-03 

leave_schedule

employee_id |  leave_datedate | reason 
     1  |  2014-01-01 | sick leave 
     1  |  2014-01-02 | vacation leave 

вот мой запрос

select e.employee_id, e.employee_name, a.date, l.leave_date, l.reason from employee e left join attendance a ON a.employee_id = e.employee_id left join leave_schedule l on l.employee_id = e.employee_id and a.date = l.leave_date where e.employee_id = 1

там результат

employee_id | employee_name | date   | leave_date | reason 
    1   |  george  | 2014-01-02 | 2014-01-02 | vacation leave 
    1   |  george  | 2014-01-03 | null  | null 

я хочу, чтобы включить больничный. как это сделать? это полное внешнее соединение?

ожидаемый результат

employee_id | employee_name | date   | leave_date | reason 
     1   |  george  | 2014-01-01 | 2014-01-01 | sick leave 
     1   |  george  | 2014-01-02 | 2014-01-02 | vacation leave 
     1   |  george  | 2014-01-03 | null  | null 

вот мой sqlfiddle

http://sqlfiddle.com/#!2/ad86b/1

ответ

0

Вы можете сделать это с помощью более сложного запроса. Ниже приведен подход, который использует агрегирование и union all, чтобы привести даты отпуска вместе:

select e.employee_id, e.employee_name, al.date, al.leave_date, al.reason 
from employee e left join 
    (select employee_id, date, leave_date, max(reason) as reason 
     from (select a.employee_id, a.date, a.date as leave_date, NULL as reason 
      from attendance a 
      union all 
      select l.employee_id, l.leave_date, l.leave_date, l.reason 
      from leave_schedule l 
      ) al 
     group by employee_id, date, leave_date 
    ) al 
    ON al.employee_id = e.employee_id 
where e.employee_id = 1; 
+0

это хорошо. Я хочу понять это больше. почему вы использовали max (reason)? – Jayvee

+0

кстати. спасибо, чувак: D – Jayvee