在php中创建嵌套组时中断循环

在php中创建嵌套组时中断循环,php,mysql,sql,phpmyadmin,Php,Mysql,Sql,Phpmyadmin,我在我的项目中有一些功能,我们在其中创建组和子组。但是,在这里,孩子们从父母那里得到了高度优先权 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 ----

我在我的项目中有一些功能,我们在其中创建组和子组。但是,在这里,孩子们从父母那里得到了高度优先权

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
----------------------------------------
所以,当我进入A组并试图将A组与C组的家长联系起来时,A组不应该允许我这样做。 我想为此编写sql查询。 请帮我解决这个问题


谢谢

您可以创建以下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 ;
使用此选项,您可以在服务器端语言中设置条件,也可以在查询中将其用作派生表来设置条件