2013-08-21 22 views
2

我做了一些挖掘,無法安排在我的腦海裏......我的問題是找到同一項目中的員工和經理?我有2個表,他們是員工和項目。他們喜歡;同一個項目中的員工和經理? SQL

*Employee*    
    ----------    
    employee_id (PK)   
    name 
    manager_id (FK) ref employee_id in same table which is employee_id. 
    usertype  

    *Project* 
    ---------- 
    project_id(PK) 
    project_name 
    employee_id(FK) ref employee_id in emplyee table 
    manager_id(FK) ref employee_id in emplyee table 

讓我更具體。項目必須有1名經理和幾名員工。我如何寫查詢? usertype列指定此員工MANAGER或USER(普通員工)。

查詢運行例如:

 ______ ______________ ____________ 
     |name| |manager_name| |project_name| 
     John   Susan  CalendarIphone 
     Mike   Susan  CalendarIphone 
     Joe   Patrick  AndoridApp 
     Megan  Susan  CalendarIphone 
     Melek  Patrick  AndoridApp 

,你可以看到邁克在多個項目上工作,可以有一個以上的經理。但管理人員只能擁有一個項目。那麼我應該如何做到這一點呢?預先感謝。

編輯--------------------------------------------- ----------------------------------

我有一個項目有下拉列表。我在這裏選擇了一個項目,根據這個項目向我展示了一張桌子,並列出了該項目的經理,該項目的員工。我問項目名稱只是創建一個可以忽略它的列。我只想看看它的經理和員工。

編輯2 -------------------------------------------- ---------------

例如項目ID = 2,在這個項目中我們有1個經理和員工。

|name| |manager_name|  
    John   Susan  
    Mike   Susan  
    Joe   Susan  
    Megan  Susan  
    Melek  Susan 
+1

如果麥克的經理從項目而異的項目,然後它在'employee'表中沒有的地方(也沒有'project'表)。它應該在'project_employee'表 – Strawberry

+0

我不理解經理也是員工? manager_id應該引用employee_id嗎? – Pitch

回答

0
SELECT e.name AS name, 
     m.name AS manager_name, 
     project_name 
FROM Project p 
    JOIN Employee e ON e.employee_id = p.employee_id 
    JOIN Employee m ON m.employee_id = p.manager_id 

由於每個項目行有員工和經理,這是因爲要到Employee表上的兩個不同的密鑰,以獲得員工的名字以及該經理的名字一樣簡單。那麼,將查詢建立在項目基礎上是很自然的,因爲這是您收集的信息,因此您可以從那裏獲取project_name

4

你的模式不好。它應該是這樣的:

Employee*    
    ----------    
    employee_id (PK)   
    name 
    manager_id (FK) ref employee_id in employee table 

    *Project* 
    ---------- 
    project_id(PK) 
    project_name 
    manager_id(FK) ref employee_id in employee table 

    *Project_Employee* 
    ---------- 
    project_id(FK) ref project_id in project table 
    employee_id(FK) ref employee_id in employee table 

那麼你可以做:

select 
     e.name as name, 
     em.name as manager_name 
     p.project_name 
     pm.name as project_manager_name 
    from Employee as e 
     left outer join Employee as em on em.employee_id = e.manager_id 
     left outer join Project_Employee as pe on pe.employee_id = e.employee_id 
     left outer join Project as p on p.project_id = pe.project_id 
     left outer join Employee as pm on pm.employee_id = p.manager_id 

,但作爲每個員工可以有多個項目,員工可以在此查詢複製

更新

select 
    e.name, u.is_manager 
from (
    select employee_id, 0 as is_manager from Project_Employee as pe where pe.idproject_id= <project id> 
    union all 
    select manager_id, 1 as is_manager from Project as p where p.project_id= <project id> 
) as u 
    inner join Employee as e on e.employee_id = u.employee_id 
order by u.is_manager desc 

更新2

select 
    e.name as employee_name, 
    pm.name as manager_name 
from Project_Employee as pe 
    left outer join Employee as e on e.employee_id = pe.employee_id 
    left outer join Project as p on p.project_id = pe.project_id 
    left outer join Employee as pm on pm.employee_id = p.manager_id 
where pe.project_id = <project id> 
+0

謝謝你的回答......你建議避免重複嗎? – Pitch

+0

在你的問題有Mark的重複。您可以使用group_concat將僱員的所有項目以逗號分隔的字符串,例如,我不知道您的目標是什麼。 –

+0

我明白你的觀點。請看看我的編輯。預先感謝 – Pitch

相關問題