Mysql 循环以查找父id,直到它给出null
谁能帮我查询一下。我有与下图1相同的问题。区别在于我在图2中的数据与他的不同。如果我搜索用户id,它会给我父id,然后它会在用户id中搜索父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
知道深度不是固定的(它可能会变化),我认为没有其他方法可以做到这一点,而是使用带有循环的存储过程/函数。
下面是一个使用
存储过程的工作示例:
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。也许在这个时候我们可能不需要参数。你能解释更多关于代码的信息吗?谢谢