2014-09-05 90 views
3

我的項目中有功能,我們正在製作羣組和子羣組。但是,這裏的兒童羣體從父母那裏得到高度重視。在php中創建嵌套羣組時打破循環

eg. A (parent) -> B(child) -> C(sub child) 

B is associated with A 
C is associated with B 

在下一步,它可能我可以與A關聯。但是,它會創建我需要打破的循環。這裏,上面的C具有最高優先級,可以訪問B(數據)和A(數據),B具有第二優先級並且可以訪問A(數據)。

我的數據庫結構:

Group table 
------------------------------------------ 
id  name parentId 
------------------------------------------ 
1  A  null 
2  B   1 
3  C   2 
------------------------------------------- 

Group_Data Table 
-------------------------------------- 
gd_id  grp_id  Data 
-------------------------------------- 
11    1   Peter 
22    2   Dennis 
33    3   Jene 
---------------------------------------- 

所以,當我訪問,並嘗試accosiate A組與父母爲C,那麼它應該不會讓我。 我想寫這個sql查詢。 請幫我解決這個問題。

謝謝!

回答

3

您可以創建下面的MySQL函數來獲取所有的祖先

DELIMITER $$ 
DROP FUNCTION IF EXISTS `GetGroupAncestry` $$ 
CREATE FUNCTION `GetGroupAncestry` (GivenID INT) RETURNS VARCHAR(1024) 
DETERMINISTIC 
BEGIN 

    DECLARE rv VARCHAR(1024); 
    DECLARE cm CHAR(1); 
    DECLARE ch INT; 

    SET rv = ''; 
    SET cm = ''; 
    SET ch = GivenID; 

    WHILE ch > 0 DO 
     SELECT IFNULL(parentId,-1) INTO ch FROM 
     (SELECT parentId FROM Group WHERE id = ch) A; 

     IF ch > 0 THEN 
      SET rv = CONCAT(rv,cm,ch); 
      SET cm = ','; 
     END IF; 

    END WHILE; 

    RETURN rv; 

END $$ 
DELIMITER ; 

使用這個你可以使用它作爲派生表設置在您的服務器端語言條件以及在您查詢。