2013-08-21 2 views
2

Я сделал некоторые копания и не мог уладить это в своем уме ... Моя проблема заключается в поиске сотрудников и менеджеров, которые находятся в одном проекте? У меня есть 2 таблицы, которые являются Employee и Project. И им нравится;Сотрудники и менеджеры в том же проекте? 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 указан этот сотрудник МЕНЕДЖЕР ИЛИ ПОЛЬЗОВАТЕЛЬ (обычный сотрудник).

запроса запуск Пример:

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

AS вы можете увидеть, Майк может работать более чем в одном проекте, и может иметь более одного менеджер. Но менеджеры должны владеть только одним проектом. Итак, как мне это сделать для этого? Заранее спасибо.

EDIT --------------------------------------------- ----------------------------------

У меня есть проект с выпадающим списком. Я выбрал проект здесь, и он показывает мне таблицу в соответствии с этим проектом и перечислил меня Менеджер этого Проекта, Сотрудники в этом проекте. Я попросил название проекта просто создать еще один столбец, который вы можете его игнорировать. Я просто хочу видеть в нем Менеджера и сотрудников.

EDIT 2 -------------------------------------------- ---------------

Идентификатор проекта = 2, например, и в этом проекте у нас есть 1 менеджер и сотрудники.

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

Если менеджер Майк варьируется от проекта к проекту, то он не имеет места в 'employee' таблицы (ни' project' таблицу). Он должен находиться в таблице 'project_employee' – Strawberry

+0

Который я не понимаю, менеджер также является сотрудником? Должен ли менеджер_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

в вашем вопросе есть дубликат для Марка. Вы можете использовать group_concat, чтобы получить все проекты для Employee для разделенной запятой строки, например, я не знаю, каковы ваши цели. –

+0

Я вижу вашу мысль. Пожалуйста, взгляните на мое редактирование.Заранее спасибо – Pitch

Смежные вопросы