如果你想从你所在的点向下走,你可以使用临时表来做到这一点。
CREATE TABLE tempTable (id int, parentid int);
INSERT INTO tempTable (id, parentid)
SELECT id, parentID FROM tree WHERE id = @input;
SET @LastCount=0;
SELECT @Count = COUNT(1) FROM tempTable;
WHILE @LastCount != @Count DO
INSERT INTO tempTable (id, parentid)
SELECT id,parentid from tree where id in (SELECT parentid FROM TempTable) AND ID NOT IN (SELECT id FROM TempTable);
@LastCount = @Count;
SELECT @Count = COUNT(1) FROM tempTable;
END WHILE;
SELECT * FROM tempTable;
DROP tempTable;
这将一遍又一遍地循环,进一步向下层级,添加当前在表中具有父级的行,只要这些行不存在,并在没有添加新行时结束循环(最后一个循环行数 = 当前循环行数)这样做的好处是根本不关心层次结构的大小,它可以是 3 级或 30 级,也不关心你从哪里开始,它总是再往下一层。
如果您想要包含该节点的整个层次结构,您可以沿着层次结构向上循环,直到找到一个没有父节点的树(如果您在同一张表中有多个树,比如说多个带有过道和货架的仓库,每个仓库顶层):
SET @next = @input;
WHILE @next IS NOT NULL DO
SET @topID = @next;
SELECT @next = parentID FROM tree WHERE id=@topID;
END WHILE
CREATE TABLE tempTable (id int, parentid int);
INSERT INTO tempTable (id, parentid);
SELECT id, parentID FROM table WHERE id = @topID;
SET @LastCount=0;
SELECT @Count = COUNT(1) FROM tempTable;
WHILE @LastCount != @Count DO
INSERT INTO tempTable (id, parentid)
SELECT id,parentid from tree where id in (SELECT parentid FROM TempTable) AND ID NOT IN (SELECT id FROM TempTable);
@LastCount = @Count;
SELECT @Count = COUNT(1) FROM tempTable;
END WHILE;
SELECT * FROM tempTable;
DROP tempTable;
这将运行到树的顶部,然后逐级循环返回。任何一个都可以在 while 循环中使用计数器变量来查找从您开始的点开始的相对级别。
SQLFiddle 不允许其中一些函数对 MySQL 正常工作,但我确实有一个 MsSQL fiddle 显示此函数有效 - MsSql Fiddle