我有一张包含以下假设数据的表格:
ID | Name | managerId
---|---------|-----------
1 | James | 2
2 | Martin | 4
3 | Huges | 5
4 | Richard | NULL
5 | Kavin | 4
6 | Rita | 3
在上表中我们有:
理查德是马丁的经理詹姆斯的经理。
Richard是经理Kavin是Huges的经理,是Rita的经理。
现在我必须在此表中选择员工的直接经理和总经理。我的意思是,如果我们从Rita
开始,我必须选择Huges
(直接经理)和Richard
(经理)。
如何做到这一点。我根本不知道。
修改:
没有任何特定级别的经理。对于层次结构中的经理,员工可以拥有'n'数字,其中n∈{0,1,2,3 .....}
答案 0 :(得分:0)
因为你只需要两个级别,所以使用自联接两次这样做是非常可行的。此外,您可能需要left join
:
select t.*, tm.name as managername, tmm.name as manager_managername
from t left join
tm
on t.managerId = tm.id left join
tmm
on tm.managerId = tmm.id;
您可以添加where t.name = 'Rita'
。
如果您必须在任何级别执行此操作,那么您一定要查看此question。简短的回答是,您可能需要另一种数据结构来处理MySQL中的此类查询。
答案 1 :(得分:0)
编辑:
以下答案仅适用于特定级别的家长(问题是在更改前询问)。我相信,对于N级,它需要一种完全不同的方法。
你可以用它。它可以达到三级管理人员,并找到至少拥有两级管理人员的所有员工。
SELECT aa.Name AS employee, bb.Name AS parent_manager, cc.Name AS grandparent_manager, dd.Name AS grand_grandparent_manager
FROM t1 AS aa
INNER JOIN t1 AS bb
ON aa.managerId = bb.ID
INNER JOIN t1 AS cc
ON bb.managerId = cc.ID
LEFT JOIN t1 AS dd
ON cc.managerId = dd.ID
如果您想要特定员工的经理,那就是这样。
SELECT aa.Name AS employee, bb.Name AS parent_manager, cc.Name AS grandparent_manager, dd.Name AS grand_grandparent_manager
FROM t1 AS aa
INNER JOIN t1 AS bb
ON aa.managerId = bb.ID
INNER JOIN t1 AS cc
ON bb.managerId = cc.ID
LEFT JOIN t1 AS dd
ON cc.managerId = dd.ID
WHERE aa.Name = 'Rita'