2014-09-19 5 views
0

J'ai un problème en utilisant la jointure gauche pour mes 3 tables. J'ai employé la table, table de présence et laisser la tablemysql query left joindre trois tables montrant toutes les données

J'ai une table d'employés

employé

employee_id | employee_name 
    1  | George 

présence

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 

voici ma requête

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

il résulte

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 

je veux inclure les congés de maladie. comment faire ça? est-ce une jointure externe complète?

résultat attendu

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 

ici est mon sqlfiddle

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

Répondre

0

Vous pouvez le faire avec une requête plus complexe. Voici une approche qui utilise l'agrégation et union all pour rapprocher les dates de congé:

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

c'est bon. Je veux comprendre cela plus. Pourquoi avez-vous utilisé max (raison)? – Jayvee

+0

btw. merci mec: D – Jayvee