使用MySQL,我想从具有类似字段结构的表中返回父类列表。 ID,PARENTID,NAME(标准父子层次结构)。我想遍历“树”以返回所有“父母”的列表。
我意识到“嵌套集”,可能是更好的处理方法 - 但目前我无法改变数据的结构。我希望将来能做到这一点。目前 - 我的数据集将实际上包含一些深度 - 没有什么疯狂的......也许2-5所以我的递归命中不应该'太昂贵'。
我查看了SQL Server get parent list中提供的解决方案 - 但这种语法在mySQL中爆炸......
有没有人有如何做到这一点的例子?
@kevin - thx for link - 但我仍然得到错误。 (“每个派生表必须具有自己的别名”)
这就是我所做的(修改上面的语法形式 - '适合'MySQL) - 我显然错过了一些东西......
SELECT parents.*
FROM (
SELECT taskID, task, parentID, 0 as level
FROM tasks
WHERE taskidID = 9147
UNION ALL
SELECT taskID, task, parentID, Level + 1
FROM tasks
WHERE taskID = (SELECT parentID FROM parents ORDER BY level DESC LIMIT 1)
)
想法???
实施例
ID PARENTID NAME
9146 0 thing1
9147 0 thing2
9148 9146 thing3
9149 9148 thing4
9150 0 thing5
9151 9149 thing6
查询“thing3”的父母 返回“9148,9146”
查询“thing6”的父母 返回“9149,9148,9146,0”
答案 0 :(得分:9)
在这里,我为你做了一个小功能,我在我的数据库(MAMP)中检查了它并且工作正常
use mySchema;
drop procedure if exists getParents;
DELIMITER $$
CREATE PROCEDURE getParents (in_ID int)
BEGIN
DROP TEMPORARY TABLE IF EXISTS results;
DROP TEMPORARY TABLE IF EXISTS temp2;
DROP TEMPORARY TABLE IF EXISTS temp1;
CREATE TEMPORARY TABLE temp1 AS
select distinct ID, parentID
from tasks
where parentID = in_ID;
create TEMPORARY table results AS
Select ID, parentID from temp1;
WHILE (select count(*) from temp1) DO
create TEMPORARY table temp2 as
select distinct ID, parentID
from tasks
where parentID in (select ID from temp1);
insert into results select ID, parentID from temp2;
drop TEMPORARY table if exists temp1;
create TEMPORARY table temp1 AS
select ID, parentID from temp2;
drop TEMPORARY table if exists temp2;
END WHILE;
select * from results;
DROP TEMPORARY TABLE IF EXISTS results;
DROP TEMPORARY TABLE IF EXISTS temp1;
END $$
DELIMITER ;
此代码将返回所有父级到任何深度。 您显然可以在结果中添加任何其他字段
像这样使用
call getParents(9148)
例如
答案 1 :(得分:7)
在这个例子中,我们检查了5个级别:
select
t1.parentid, t2.parentid, t3.parentid, t4.parentid, t5.parentid
from
tableName t1
left join tableName t2 on t1.parentid = t2.id
left join tableName t3 on t2.parentid = t3.id
left join tableName t4 on t3.parentid = t4.id
left join tableName t5 on t4.parentid = t5.id
where
t1.name = 'thing3'