在mysql中,如果给定一些父ID,如何选择递归结构?

在mysql中,如果给定一些父ID,如何选择递归结构?,mysql,hierarchical-data,Mysql,Hierarchical Data,我正在尝试获取所有文件夹和随后的子文件夹,并提供多个父文件夹ID。数据库表具有以下结构: id name parent_id 1 Folder1 null 2 Folder2 null 3 Folder3 1 4 Folder4 1 5 Folde

我正在尝试获取所有文件夹和随后的子文件夹,并提供多个父文件夹ID。数据库表具有以下结构:

   id           name         parent_id
   1           Folder1          null
   2           Folder2          null  
   3           Folder3           1
   4           Folder4           1
   5           Folder5           2
   6           Folder6           2
   7           Folder7           4
以下查询适用于单个id,但我希望避免执行多个查询。对于实例1和6的多个ID,它应该返回行(1、3、4、7和6)

注意:问号可以是任何id

知道如何调整此查询以接受多个ID吗

编辑:我的mysql版本是5.7,所以不幸的是,RECURSIVE不可用

对于实例1和6的多个ID,它应该返回行(1、3、4、7和6)

如果您可以使用CTE(MySQL8),下面的查询将返回它们

with recursive cte as
( select id, name, parent_id, id as top
   from folder_categories
   where id in (1,6)
  union all select a.id, a.name, a.parent_id, b.top
   from folder_categories a inner join cte b on a.parent_id=b.id)
select * from cte;

对于实例1和6的多个ID,它应该返回行(1、3、4、7和6)

如果您可以使用CTE(MySQL8),下面的查询将返回它们

with recursive cte as
( select id, name, parent_id, id as top
   from folder_categories
   where id in (1,6)
  union all select a.id, a.name, a.parent_id, b.top
   from folder_categories a inner join cte b on a.parent_id=b.id)
select * from cte;

请参见

如果不使用CTE,则需要确定搜索深度

例如,对于最多搜索4个级别的查询:

select distinct x.* from folder_categories x inner join
 (select a.id id1, b.id id2, c.id id3, d.id id4
   from
     folder_categories a
     left outer join
     folder_categories b on a.id=b.parent_id
     left outer join
     folder_categories c on b.id=c.parent_id
     left outer join
     folder_categories d on c.id=d.parent_id
   where a.id in (1,6)) y
  on x.id=y.id1 or x.id=y.id2 or x.id=y.id3 or x.id=y.id4;

但是,当表有许多行时,可能无法获得足够的性能。

如果不使用CTE,则需要确定搜索深度

例如,对于最多搜索4个级别的查询:

select distinct x.* from folder_categories x inner join
 (select a.id id1, b.id id2, c.id id3, d.id id4
   from
     folder_categories a
     left outer join
     folder_categories b on a.id=b.parent_id
     left outer join
     folder_categories c on b.id=c.parent_id
     left outer join
     folder_categories d on c.id=d.parent_id
   where a.id in (1,6)) y
  on x.id=y.id1 or x.id=y.id2 or x.id=y.id3 or x.id=y.id4;

但是,当表中有许多行时,您可能无法获得足够的性能。

您期望的输出是什么,MySQL的版本是什么?可能与您期望的输出重复,MySQL的版本是什么?可能与的重复不幸的是,我在MySQL 5.7上运行,但这是使用CTE的一个好方法!不幸的是,我运行的是mysql 5.7,但这是一个使用CTE的好方法!