我有一个employee
表,其中包含以下数据。
对于特定的经理,我希望获得所有员工的列表,遵循经理的层次结构。
id name manager
1 John 6
2 Gill 7
3 Ben 2
4 Roy 8
5 Lenin 6
6 Nancy 7
7 Sam 0
8 Dolly 3
例如,我必须让经理 Sam (7)下的员工。如您所见, Sam 没有任何经理,但他是员工 Gill 和 Nancy 的经理,他们是员工的经理 Ben 和 John,Lenin 。
所以我运行了这样的查询:
select * from employee where manager=7;
我将结果显示为2行, Gill 和 Nancy 。
但是现在,我还想在输出中向员工 Ben 和 John , Lenin 展示,因为他们都在经理之下 Gill 和 Nancy , Sam 。
如何构建查询以按层次结构显示员工?换句话说,我怎样才能展示所有 Gill , Nancy , Ben , John 和 Lenin < / strong>经理 Sam ?
答案 0 :(得分:2)
在WHERE子句中添加IN子查询将处理该问题。例如:
SELECT * FROM employee WHERE manager = 7 OR manager IN (SELECT id FROM employee WHERE manager = 7)
答案 1 :(得分:2)
为了获得更好的视觉效果,您还可以使用此查询:
select e1.name, e2.name, e3.name
from employee e1
left join employee e2 on e1.id = e2.manager
left join employee e3 on e2.id = e3.manager
where e2.manager = 7
而您必须为每个层次结构添加另一个left join
。一方面这是一个缺点,另一方面它比肖恩的答案更容易处理。
在专业方面,你会得到这样的输出:
name name1 name2
---------------------------------
Sam Gill Ben
Sam Nancy John
Sam Nancy Lenin
更友好,你可以通过PHP或其他东西轻松地将它放在一个更友好的形式。