2013-09-30 124 views
2

我有一個用戶ID表,經理ID如下:獲得母公司所有的孩子在MySQL查詢

id  manager 
------- ------- 
admin (NULL)  
james admin 
user  james 
workad user 
creator workad 

現在我希望所有的孩子(後代)爲一個用戶ID。換句話說,對於userid james我需要孩子用戶,工作人員,創建者。因爲詹姆斯是最高的父母(祖先)。是否有任何查詢在mysql中獲取像這樣的結果...在此先感謝。

+0

您需要編寫一個存儲過程。 MySQL不支持遞歸查詢。 –

+0

我也是這樣想的。但我嘗試寫一個單一的查詢.. –

+0

你可以**不**在MySQL中做一個單一的查詢。 –

回答

3

對於您需要有一個存儲功能:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `junk`.`GetFamilyTree` $$ 
CREATE FUNCTION `GetFamilyTree` (GivenID VARCHAR(1024)) RETURNS varchar(1024) CHARSET latin1 
DETERMINISTIC 
BEGIN 

    DECLARE rv,q,queue,queue_children,front_id VARCHAR(1024); 
    DECLARE queue_length,pos INT; 

    SET rv = ''; 
    SET queue = GivenID; 
    SET queue_length = 1; 

    WHILE queue_length > 0 DO 
     SET front_id = queue; 
     IF queue_length = 1 THEN 
      SET queue = ''; 
     ELSE 
      SET pos = LOCATE(',',queue) + 1; 
      SET q = SUBSTR(queue,pos); 
      SET queue = q; 
     END IF; 
     SET queue_length = queue_length - 1; 

     SELECT IFNULL(qc,'') INTO queue_children 
     FROM (SELECT GROUP_CONCAT(id) qc 
     FROM Table1 WHERE manager = front_id) A; 

     IF LENGTH(queue_children) = 0 THEN 
      IF LENGTH(queue) = 0 THEN 
       SET queue_length = 0; 
      END IF; 
     ELSE 
      IF LENGTH(rv) = 0 THEN 
       SET rv = queue_children; 
      ELSE 
       SET rv = CONCAT(rv,',',queue_children); 
      END IF; 
      IF LENGTH(queue) = 0 THEN 
       SET queue = queue_children; 
      ELSE 
       SET queue = CONCAT(queue,',',queue_children); 
      END IF; 
      SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1; 
     END IF; 
    END WHILE; 

    RETURN rv; 
END $$ 

然後就可以調用,如:

SELECT `id`, `manager`,GetFamilyTree(`id`) as children 
from Table1; 

你可以有過濾器,以及:

SELECT `id`, `manager`,GetFamilyTree(`id`) as children 
from Table1 where `id` = 'james'; 

SAMPLE FIDDLE

+0

過程有效,但我是搜索有無論如何單個查詢 –

+0

這是不可能的在mysql :( –

+0

任何人都知道是否有可能在HQL? –