获取递归父列表

时间:2011-09-27 12:49:38

标签: mysql sql recursion

使用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”

2 个答案:

答案 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'