2014-10-05 54 views
0

我有一張名爲'employees'的表,其中包含一些數據,如員工ID,員工姓名和經理ID。 我已自己加入,以顯示每位經理下的下屬人數。SQL/Self Join /下屬人數

它看起來像這樣和正常工作:SQL fiddle link

表看起來是這樣的:

CREATE TABLE employees (
    emp_id INT, 
    emp_name VARCHAR(16), 
    mgr_id INT, 

); 


INSERT INTO employees VALUES 
(1,'George',5), 
(2,'Monica',5), 
(3,'Rachel',5), 
(4,'Marie',5), 
(5,'Emma',6), 
(6,'David',NULL); 

並表示由經理分組直接下屬的數量查詢本身是這樣的:

SELECT 

    m.emp_name, 
    COUNT(e.emp_name) AS number_of_subordinates 

FROM 

    employees as e 
    JOIN employees as m 
    ON e.mgr_id=m.emp_id 

GROUP BY m.emp_name 
ORDER BY number_of_subordinates DESC 

但是,這顯示我每個經理的直接下屬。我希望能夠展示的還有間接下屬的數量。所以,舉個例子,雖然艾瑪仍然有4個下屬,但大衛會有4個艾瑪加上等於5的艾瑪(因爲他是艾瑪的老闆,而艾瑪是喬治,莫妮卡,雷切爾和瑪麗的老闆)

+0

請將您的問題發佈到您的問題本身。如果鏈接的SQLFiddle過時了,這個問題對於未來的訪問者就變得毫無價值(編輯:謝謝) – Bojangles 2014-10-05 20:51:04

+2

您需要做一個遞歸或分層查詢。 MySQL基本上不支持這些查詢。要做你想做的事,你需要使用一個存儲過程(或者改變數據結構或者使用不同的數據庫引擎)。 – 2014-10-05 20:52:35

+1

如果你只是想要一個設定的深度,說只有最多2級的子座標,你可以做每個深度的加入。但是,如果您希望它適用於所有樹,則需要遞歸查詢,而MySQL並不支持該查詢。 – wvdz 2014-10-05 20:55:12

回答

1

你'重新尋找一個recursive self join,這是不是在MySQL的支持,但它在許多其他DBMS(甲骨文,微軟SQL服務器,DB2和PostgreSQL等)。

This answer提供了一種方法來解決這個問題,雖然這是不理想的,如其評論中所述。this question的答案討論了在MySQL中表示分層數據的替代方式:

來源:here

+0

謝謝!我是新來的SQL所以不知道如何做遞歸加入:(我需要明天就能做到這一點。任何志願者快速告訴我如何在這個例子中做到這一點:) – user3552829 2014-10-05 21:03:08

+0

你可以'在MySQL中做一個。除非你想切換到另一個DBMS,或者改變你的數據庫結構,否則你可能不得不使用我建議的方法來解決它。看到我鏈接的答案。 – gandaliter 2014-10-05 21:05:36

+0

我在看,但努力瞭解它如何在我的情況下工作。就像我說的,我是一個新手,並且還不擅長解碼東西。 – user3552829 2014-10-05 21:16:43