在mysql中,如果给定一些父ID,如何选择递归结构?
我正在尝试获取所有文件夹和随后的子文件夹,并提供多个父文件夹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 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的好方法!