Mysql 循环以查找父id,直到它给出null

Mysql 循环以查找父id,直到它给出null,mysql,parent-child,Mysql,Parent Child,谁能帮我查询一下。我有与下图1相同的问题。区别在于我在图2中的数据与他的不同。如果我搜索用户id,它会给我父id,然后它会在用户id中搜索父id,直到它给出null。多谢各位 知道深度不是固定的(它可能会变化),我认为没有其他方法可以做到这一点,而是使用带有循环的存储过程/函数。 下面是一个使用存储过程的工作示例: CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `number` int) BEGIN DECLA

谁能帮我查询一下。我有与下图1相同的问题。区别在于我在图2中的数据与他的不同。如果我搜索用户id,它会给我父id,然后它会在用户id中搜索父id,直到它给出null。多谢各位


知道深度不是固定的(它可能会变化),我认为没有其他方法可以做到这一点,而是使用带有循环的存储过程/函数。
下面是一个使用
存储过程的工作示例:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `number` int)
BEGIN
    
    DECLARE parentNumber INT DEFAULT NULL;
    
    DROP TEMPORARY TABLE IF EXISTS temp1;
    CREATE TEMPORARY TABLE IF NOT EXISTS temp1(col1 int, col2 int, col3 int);
    
    SET parentNumber = number;
    
    myloop: 
    WHILE (parentNumber IS NOT NULL)
    DO 
    
        SET @cnt = 0;
        SELECT COUNT(1) INTO @cnt FROM test WHERE col1 = parentNumber;
        
        IF @cnt = 1 THEN
            INSERT INTO temp1 SELECT * FROM test WHERE col1 = parentNumber;
            SELECT col3 INTO parentNumber FROM test WHERE col1 = parentNumber;
        ELSE
            LEAVE myloop;
        END IF;
            
        IF parentNumber IS NULL THEN
            LEAVE myloop;
        END IF;
         
    END WHILE myloop;
    
    SELECT * FROM temp1;
    DROP TEMPORARY TABLE IF EXISTS temp1;

END  

您可以根据自己的需要对其进行更改,但重要的是:尝试理解并使用它,而不仅仅是将其插入并运行。

知道深度不是固定的(可能会有所不同),我认为没有其他方法可以做到这一点,而只是使用带有循环的存储过程/函数。
   with  cte(col1,col2,col3) as (
      select     col1,
                 col2,
                 col3
      from       sample1 
      where      col1 = 1
      union all
      select     yt.col1,
                 yt.col2,
                 yt.col3
      from       sample1 yt
      inner join cte 
      On yt.col1 = cte.col3
    )
    select * from cte
下面是一个使用
存储过程的工作示例:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `number` int)
BEGIN
    
    DECLARE parentNumber INT DEFAULT NULL;
    
    DROP TEMPORARY TABLE IF EXISTS temp1;
    CREATE TEMPORARY TABLE IF NOT EXISTS temp1(col1 int, col2 int, col3 int);
    
    SET parentNumber = number;
    
    myloop: 
    WHILE (parentNumber IS NOT NULL)
    DO 
    
        SET @cnt = 0;
        SELECT COUNT(1) INTO @cnt FROM test WHERE col1 = parentNumber;
        
        IF @cnt = 1 THEN
            INSERT INTO temp1 SELECT * FROM test WHERE col1 = parentNumber;
            SELECT col3 INTO parentNumber FROM test WHERE col1 = parentNumber;
        ELSE
            LEAVE myloop;
        END IF;
            
        IF parentNumber IS NULL THEN
            LEAVE myloop;
        END IF;
         
    END WHILE myloop;
    
    SELECT * FROM temp1;
    DROP TEMPORARY TABLE IF EXISTS temp1;

END  
你可以根据自己的需要修改它,但重要的是:试着理解和使用它,而不仅仅是插上电源就走

   with  cte(col1,col2,col3) as (
      select     col1,
                 col2,
                 col3
      from       sample1 
      where      col1 = 1
      union all
      select     yt.col1,
                 yt.col2,
                 yt.col3
      from       sample1 yt
      inner join cte 
      On yt.col1 = cte.col3
    )
    select * from cte
您将看到col1=1的结果

我添加此字段是为了显示存储过程示例

DELIMITER //
CREATE PROCEDURE Recrusive(col VARCHAR(50))
BEGIN
 with  cte(col1,col2,col3) as (
      select     col1,
                 col2,
                 col3
      from       sample1 
      where      col1 = col
      union all
      select     yt.col1,
                 yt.col2,
                 yt.col3
      from       sample1 yt
      inner join cte 
      On yt.col1 = cte.col3
    )
    select * from cte

END//
DELIMITER ;
您将看到col1=1的结果

我添加此字段是为了显示存储过程示例

DELIMITER //
CREATE PROCEDURE Recrusive(col VARCHAR(50))
BEGIN
 with  cte(col1,col2,col3) as (
      select     col1,
                 col2,
                 col3
      from       sample1 
      where      col1 = col
      union all
      select     yt.col1,
                 yt.col2,
                 yt.col3
      from       sample1 yt
      inner join cte 
      On yt.col1 = cte.col3
    )
    select * from cte

END//
DELIMITER ;


我测试了我的查询,它工作了。我测试了我的查询,它工作了。非常感谢你,我会尝试。你能帮我确定要插入到你给出的代码中的变量吗?因为我很难输入什么。@olankendrick你只传递你想要的值,作为一个参数<代码>呼叫测试(1)
(参数<代码>号码
)。现在,这个参数是
INT
,但是您的值可能是
varchar
,因此,如果您愿意,您可以更改该过程,例如将
number
parentnumber
设置为
varchar
。非常感谢您,我将尝试使用它。您能帮我确定要插入到您提供的代码中的变量吗?因为我有问题,我将输入什么。@olankendrick您只传递该值您需要,作为一个参数<代码>呼叫测试(1)(参数<代码>号码)。现在,这个参数是
INT
,但是您的值可能是
varchar
,因此如果您愿意,您可以更改过程,将
number
parentnumber
设置为
varchar
。非常感谢。欢迎您。这是一个重复代码。我总是试图找到最简单的,使用更少的代码。我们可以使用这个生成的查询的值作为同一查询的变量吗?这个图像在我的问题中,兄弟。非常感谢你。举个例子,你可以用一个参数编写一个存储过程,当你需要的时候,你可以用一个参数调用这个过程。我想我们可以再写一个递归cte。也许此时我们可能不需要参数。您能解释更多关于代码的信息吗?非常感谢。不客气。这是一个重复代码。我总是试图找到最简单的,使用更少的代码。我们可以使用这个生成的查询的值作为同一查询的变量吗?这个图像在我的问题中,兄弟。非常感谢你。举个例子,你可以用一个参数编写一个存储过程,当你需要的时候,你可以用一个参数调用这个过程。我想我们可以再写一个递归cte。也许在这个时候我们可能不需要参数。你能解释更多关于代码的信息吗?谢谢