我正在处理一个包含父子关系的表
我需要找到父母->孩子->其他孩子->…
对于上表数据,我希望得到的结果是
我看到了一些来自sof的代码,但不知道它们是如何工作的,我试着用一个非常简单的逻辑在我的头脑中,但不幸的是它没有工作,因为一个奇怪的原因
我已经为它编写了存储过程,但遇到了referrals的问题。

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();

首先,我在第一个查询中得到我想要的主父项的子项,运行良好
然后,将主父级的子级放入变量IN CLAUSEqueryA,运行良好
然后在循环中,我使用查询中的变量@idss获取其子查询B,并将它们放入结果表中…这是有问题的部分
在这里,对于第一次迭代,我在变量idss中有C,这将导致在表中插入值1111,2222,但它只将idssie{3333, 4444} child of 1111, and {5555} child of 2222的子项,而不是1111
我试图替换query3333,4444中的变量以进行检查,它在claues中的值5555中运行良好`
关于in子句为什么不接受组concat中逗号分隔的值的任何想法或关于修复此代码的任何想法
当做

最佳答案

试试这个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);
我希望它能为你工作…

10-08 01:34