2015-10-04 42 views
0

我有一個表如下假設數據:選擇在一個表中的一行的盛大母公司 - 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 .....}

+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中的這種類型的查詢。

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' 
+0

沒有任何特定級別的經理。員工可以有'n'號碼給經理,其中nε{0,1,2,3 .....} – Tariq