MySQL多级父子SP和IN子句

MySQL多级父子SP和IN子句,mysql,sql,Mysql,Sql,我正在处理一个包含父子关系的表引用 我需要得到父母->孩子->其他孩子-> 对于上表数据,我希望的结果是 我看过一些来自软件的代码,但不知道它们是如何工作的,我试着用一个非常简单的逻辑在我的脑海中,但不恰当的是,它不工作,因为一个奇怪的原因 我已经为它编写了存储过程,但遇到了IN子句的问题 首先,我在第一个查询A中获得了我想要的主父级的子级,工作正常 然后,将主父级的子级放入变量@idss query B中,工作正常 然后在循环中,我在查询中使用变量idss获取其子查询C,并将它们放入结果表中。

我正在处理一个包含父子关系的表引用

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

对于上表数据,我希望的结果是

我看过一些来自软件的代码,但不知道它们是如何工作的,我试着用一个非常简单的逻辑在我的脑海中,但不恰当的是,它不工作,因为一个奇怪的原因

我已经为它编写了存储过程,但遇到了IN子句的问题

首先,我在第一个查询A中获得了我想要的主父级的子级,工作正常

然后,将主父级的子级放入变量@idss query B中,工作正常

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

在这里,对于第一次迭代,我在变量idss中有11112222,这将导致在表中插入值{3333,4444}1111的child,和{5555}2222的child,但它只将1111的子项,即33334444,而不是5555

我尝试将查询C中的变量替换为check,它在Claues中的值为11112222'时运行良好`

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

关于

请在@idss\u SETuid1中尝试此查找

您必须替换此查询部分

从@idss中uid1所在的转介中选择GROUP_CONCATuid2

进入这个

在@idss中的\u SETuid1中查找\u的推荐中选择组\u CONCATuid2


我希望它能为您服务……

MySQL不支持递归函数,因此它不太适合这种存储分层数据的邻接列表模型。您应该考虑使用嵌套集合或闭包表重构数据。有关更多信息,请参阅。这一点需要注意。。。从x中选择*,其中y在1,2,3中与从x中选择*,其中y在“1,2,3”中根本不同。在第一种情况下,有3个整数项,但在第二种情况下,只有一个项,并且该项是一个字符串。MySQL不将该字符串视为数字列表;您有一个字符串列表,只有一项。要将字符串转换为整数列表,需要查找拆分函数;网上有很多。这样一个函数可以用于类似的查询:SELECT*FROM x,其中y在SELECT*FROM fn_split'1,2,3'AS list.hey it worked man!对不起,我从来没听说过这个功能。。只有一个问题;查询的性能。。谷歌正在对此大惊小怪。如果你能分享一些链接,它可能会帮助我更多。。。当做:
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();