我有关于数据库表和查询的问题。让我来讲述这是什么。这是关于项目经理与员工的关系。现在让我在发言中说出他们的关系......
经理 =经理是项目负责人或可能是多个项目的经理。
员工 =(s)他是一名只管理由经理管理的项目或项目的人。
项目 =项目是仅由一个管理员管理的项目。
员工 - 经理人关系
经理也是公司的员工吗?根据这个我希望他们的关系像 - >一名员工可由多名经理管理 所有经理都是同一个标题我的意思是没有经理的经理。员工只有经理。例如,经理可以管理5名员工。
员工 - 项目关系
员工可以拥有一个有意义的项目,员工也可以拥有一个以上有意义的项目。所以项目也可以有一个以上的员工。 (提醒:项目可以有多个员工,但不能由多个经理管理)。
经理 - 项目关系
经理可以拥有多个项目。但项目不能由多个经理管理。
PS:根据项目,不同项目中的同一员工可以由多个经理管理。请参阅下面的示例...
Android App PROJECT的经理 ---->帕特里克
Android App PROJECT的员工 ----->约翰,苏珊,梅根,乔。
另一个项目......
IOS App PROJECT的经理 ---->莱恩
IOS App PROJECT的员工 ---->克莱尔,沃尔特,罗伯特,梅根
现在让我展示我的表......我真的不知道该怎么办......
在该表中,我试图这样做“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选择项目的查询。如果我的桌子出错了你可以指导我或告诉我该怎么办?
我有知识,但无法弄明白我该怎么做才能做到这一点。
答案 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