mysql - 获取递归父列表

标签 mysql sql recursion

使用 MySQL,我想从具有这样的字段结构的表中返回 parent 列表。 ID,PARENTID,NAME(标准的父子层次结构)。我想“向上”遍历树以返回所有“ parent ”的列表。

我意识到“嵌套集”可能是处理此问题的更好方法 - 但目前我无法更改数据结构。我希望将来这样做。目前 - 我的数据集实际上将包含几个深度级别 - 没有什么疯狂的......可能是 2-5,所以我的递归命中不应该“太昂贵”。

我查看了 SQL Server get parent list 中提供的解决方案- 但是这个语法在 mySQL 中爆炸...

有没有人有如何做到这一点的例子?

@kevin - 感谢链接 - 但我仍然遇到错误。 (“每个派生表都必须有自己的别名”)

这是我所做的(修改了文章上方的语法形式 - 以“适应”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”的 parent 返回 "9148,9146"

查询“thing6”的 parent 返回“9149,9148,9146,0”

最佳答案

在这里,我为你做了一个小功能,我在我的数据库(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)

例如

关于mysql - 获取递归父列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569399/

相关文章:

mysql - Sql - 带案例选择语句的 IN 子句

SQL更新查询和 'subquery returned more than one value'

mySQL:用 <p> 替换/n 的所有实例

c - 递归遍历目录时 C 中的 gmtime 不一致

Mysql自删除记录

java - 在 Eclipse 中运行程序时,使用 Hibernate 的 Eclipse 不加载 mysql 驱动程序 jar

MySQL组合2列作为主键

algorithm - 唐叶算法

linux - Linux 中的递归批量编辑

PHP 内连接类别