在单个表中选择一行的祖父 - SQL

时间:2015-10-04 11:16:39

标签: mysql sql

我有一张包含以下假设数据的表格:

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 .....}

2 个答案:

答案 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'