【问题标题】:Employees and managers in the same Project? SQL同一项目中的员工和经理? SQL
【发布时间】:2013-08-21 21:28:48
【问题描述】:

我进行了一些挖掘,但无法在脑海中安排......我的问题是找到在同一个项目中的员工和经理?我有 2 个表,它们是 Employee 和 Project。他们喜欢;

   *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 OR USER(普通员工)。

查询运行示例:

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

正如您所见,Mike 可以参与多个项目,并且可以拥有多个经理。但经理必须只拥有 1 个项目。那么我该怎么做才能得到这个呢?提前致谢。

编辑------------------------------ ----------------------------------

我有一个包含下拉列表的项目。我在这里选择了一个项目,它根据该项目向我显示了一个表格,并列出了该项目的经理,该项目中的员工。我问了项目名称,只需再创建一列,您可以忽略它。我只是想看看它的经理和它的员工。

编辑 2--------------------------------------------------------- --------------

例如,项目 ID = 2,在这个项目中,我们有 1 名经理和员工。

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

【问题讨论】:

  • 如果 Mike 的经理因项目而异,那么它在employee 表(也不是project 表)中没有位置。它应该在project_employee 表中
  • 我不明白经理也是员工? manager_id 应该引用employee_id 吗?

标签: mysql sql database


【解决方案1】:

您的架构不好。它应该是这样的:

   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>

【讨论】:

  • 感谢您的回答...您建议避免重复什么?
  • 在您的问题中,Mark 有重复项。您可以使用 group_concat 来获取员工的所有项目以逗号分隔的字符串,例如,我不知道您的目标是什么。
  • 我明白你的意思。请看一下我的编辑。提前致谢
  • 检查更新的查询。我仍然没有得到您的确切要求,我的查询将返回您的员工列表和位属性 is_manager
  • 感谢您的回答,它有帮助。让我再问你一次 :) 我想在同一个项目中获得经理姓名和员工姓名。但经理不能有超过 1 个项目。员工可以从事多个项目。当我运行查询时,它应该在我上次更新中返回:) 请参阅答案
【解决方案2】:
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 进行查询,因为这是您正在收集的信息,因此您可以从那里获取 project_name

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2022-12-12
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多