3

我正在处理referrals包含父子关系的表

在此处输入图像描述

我需要得到父母 -> 孩子 -> 其他孩子 -> ....

对于上表数据,我想要的结果是

在此处输入图像描述

我从 SOF 看到了一些代码,但不知道它们是如何工作的,并在我的脑海中尝试了一个非常简单的逻辑,但不幸的是,由于一个奇怪的原因它不能正常工作

我已经为它编写了存储过程,但遇到了一个问题IN CLAUSE

DELIMITER $$

DROP PROCEDURE IF EXISTS `GetHierarchy3`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetHierarchy3`()
BEGIN
    DECLARE idss VARCHAR(225);
    SET @currentParentID := 999999;
    SET @lastRowCount := 0;

  ## A ##   
        INSERT INTO referrals_copy SELECT * FROM referrals WHERE uid1 = @currentParentID;

    SET @lastRowCount := ROW_COUNT();

 ## B ##
        SELECT GROUP_CONCAT(uid2)  INTO @idss FROM referrals WHERE  uid1 = @currentParentID;


    #SELECT @lastRowCount;
    SELECT * FROM referrals_copy;

    WHILE @lastRowCount > 0 DO
    SELECT "here";

        SELECT @idss;
  ## C ##
            INSERT INTO referrals_copy SELECT uid1, uid2 FROM referrals 
                WHERE uid1 IN (@idss);
            SET @lastRowCount := ROW_COUNT();
        #set @ids := NULL;
        SELECT @idss;
        SELECT GROUP_CONCAT(uid2) FROM referrals WHERE  uid1 IN (@idss);
        SELECT @idss;
        SET @lastRowCount := 0;

    END WHILE;


    -- return the final set now
    SELECT 
            *
        FROM referrals_copy;

END$$

CALL GetHierarchy3();

首先,我在第一个查询中得到我想要的主要父母的孩子A,工作正常

然后,将主父级的子级获取到变量@idss查询B中,工作正常

然后在循环中我使用idss查询中的变量来获取其子查询C并将它们放入结果表中......这是有问题的部分

这里是我1111,2222在变量中的第一次迭代,idss这应该会导致在表中插入值{3333, 4444} child of 1111, and {5555} child of 2222,但它只放置了1111ie的子级,3333,4444而不是5555

我尝试从查询中替换变量C以进行检查,并且它与1111,2222' withinIN Claues中的值一起工作正常`

关于为什么 IN 子句不接受来自组 concat 的逗号分隔值的任何想法或关于修复此代码的任何想法

问候

4

1 回答 1

5

试试这个FIND_IN_SET(uid1,@idss)

您必须替换此查询部分

SELECT GROUP_CONCAT(uid2) FROM referrals WHERE uid1 IN (@idss);

进入这个

SELECT GROUP_CONCAT(uid2) FROM referrals WHERE FIND_IN_SET(uid1,@idss);

我希望它对你有用....

于 2012-06-11T11:03:02.247 回答