2014-09-05 72 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 ; 

使用这个你可以使用它作为派生表设置在您的服务器端语言条件以及在您查询。