复杂的SQL表关系?

时间:2013-08-21 17:09:50

标签: mysql sql database

我有关于数据库表和查询​​的问题。让我来讲述这是什么。这是关于项目经理与员工的关系。现在让我在发言中说出他们的关系......

经理 =经理是项目负责人或可能是多个项目的经理。

员工 =(s)他是一名只管理由经理管理的项目或项目的人。

项目 =项目是仅由一个管理员管理的项目。

员工 - 经理人关系

经理也是公司的员工吗?根据这个我希望他们的关系像 - >一名员工可由多名经理管理 所有经理都是同一个标题我的意思是没有经理的经理。员工只有经理。例如,经理可以管理5名员工。

员工 - 项目关系

员工可以拥有一个有意义的项目,员工也可以拥有一个以上有意义的项目。所以项目也可以有一个以上的员工。 (提醒:项目可以有多个员工,但不能由多个经理管理)。

经理 - 项目关系

经理可以拥有多个项目。但项目不能由多个经理管理。

PS:根据项目,不同项目中的同一员工可以由多个经理管理。请参阅下面的示例...

Android App PROJECT的经理 ---->帕特里克

Android App PROJECT的员工 ----->约翰,苏珊,梅根,乔。

另一个项目......

IOS App PROJECT的经理 ---->莱恩

IOS App PROJECT的员工 ---->克莱尔,沃尔特,罗伯特,梅根

现在让我展示我的表......我真的不知道该怎么办......

Employee-Manager-Project current realationship

在该表中,我试图这样做“manager_id(FK)”指的是“employee_id(PK)”,因为经理是公司的员工。

我在Project表中有“manager_id(FK)”,在employee表中引用“manager_id”。

哪个是proj_employee表我还不清楚。我在互联网的例子中找到了这种方式。这样我们就可以在查询中调用它们。

现在让我发布我尝试的查询,但从未得到解决方案......

        select
    e.name as employee_name,
    pm.name as manager_name
from Proj_Employee as pe
    left outer join Employee as e on e.employee_id = pe.emp_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>

我想问一下......我想要一个显示EmployeeName,ManagerName OF选择项目的查询。如果我的桌子出错了你可以指导我或告诉我该怎么办?

我有知识,但无法弄明白我该怎么做才能做到这一点。

3 个答案:

答案 0 :(得分:2)

我想我终于看到了问题。

你说,“我在项目表中有”manager_id(FK)“来引用员工表中的”manager_id“。”

我认为这可能是问题所在。我想您希望manager_id表中的project成为employee_id表中 employee 列的外键,而不是 manager_id 列。但是你在查询中已经做对了。


SQL Fiddle demo here: http://www.sqlfiddle.com/#!2/e31fb/1


与您的问题没有关系,但我只想借此机会指出,这是一个案例,其中每个名为id的表中的主键列有助于我们使“错误的”SQL看起来像“错误的”SQL。 "Making Wrong Code Look Wrong" - Joel Spolsky

如果我们期望:

主键的格式为: id

以外形式的外键: parent_table_id parent_role_id

绝大多数连接都是从外键到主键

然后我们希望大多数联接的形式为

child.parent_id = parent.id

并且外键定义的格式为

FK_child_parent_or_role (parent_or_role_id) REFERENCES parent (id)

这使得外键定义如下:

FK_project_manager (manager_id) REFERENCES employee (manager_id)

对我们来说是“错误的”。我们希望看到对id列的引用。

答案 1 :(得分:0)

您可以使用以下内容获取(project_name,manager_name,employee_name)的列表:

SELECT p.project_name
     , e.name as employee_name
     , m.name as manager_name
FROM project p
INNER JOIN employee m ON p.manager_id = m.employee_id
LEFT JOIN proj_employee pe ON p.project_id = pe.project_id
LEFT JOIN employees e ON pe.emp_id = e.employee_id;

你会得到两个项目,一个没有员工:

 project_name  | employee_name | manager_name 
---------------+---------------+--------------
 Stack O       | Alice         | Eve
 Stack O       | Bob           | Eve
 Lemon Squeezy |               | Alice

答案 2 :(得分:0)

我没有理由看到外部联接。

select p.Project_Name, m.name as Manager, e.name as Employee
from Project P
join Employee M on m.employee_id = p.manager_id
join project_employee pe on pe.project_id = p.project_id
join Employee E on e.employee_id = pe.employee_id