首页  >  文章  >  数据库  >  如何使用 MySQL 中的递归查询检索嵌套层次结构中的所有后代文件夹?

如何使用 MySQL 中的递归查询检索嵌套层次结构中的所有后代文件夹?

Patricia Arquette
Patricia Arquette原创
2024-11-05 16:04:02424浏览

How can I retrieve all descendant folders in a nested hierarchy using recursive queries in MySQL?

嵌套文件夹的递归查询

获取具有多层嵌套的所有子文件夹和子子文件夹对 MySQL 查询提出了挑战。虽然有多种方法,但本文将重点关注有效且全面的解决方案。

要从给定父级检索所有后代文件夹,我们可以利用递归查询,它允许在单个语句中进行嵌套计算。此方法涉及一个迭代过程,其中每个文件夹的 ID 用作下一次迭代的参数,每次循环都会扩展搜索深度。

考虑以下场景:给定一个名为 Folder 的数据库表,其中包含列 idFolder (auto -递增主键)、FolderName 和 idFolderParent(Folder.idFolder 的外键),我们用以下数据填充它:

idFolder FolderName idFolderParent
1 ADoc NULL
2 ADoc1 1
3 ADoc2 2
4 ADoc3 3
5 ADoc4 4
6 ADoc5 5
7 ADoc6 4

此结构允许我们创建嵌套文件夹层次结构。例如,如果我们查询 ADoc (idFolder=1) 的所有子文件夹,我们期望不仅检索其直接子文件夹(ADoc1、ADoc2),而且还检索它们下面的所有后代文件夹(ADoc3、ADoc4、ADoc5、ADoc6、ADoc7) .

以下 SQL 查询使用递归迭代实现此目的:

<code class="sql">WITH RECURSIVE FolderHierarchy AS (
  SELECT idFolder, FolderName, idFolderParent
  FROM Folder
  WHERE idFolder = 1
  UNION ALL
  SELECT f.idFolder, f.FolderName, f.idFolderParent
  FROM FolderHierarchy AS h
  JOIN Folder AS f
    ON h.idFolderParent = f.idFolderParent
)
SELECT idFolder, FolderName
FROM FolderHierarchy;</code>

此查询使用名为FolderHierarchy 的公用表表达式 (CTE),该表达式最初选择根文件夹 (ADoc),然后递归将子文件夹加入层次结构。它会继续此过程,直到不再有子文件夹为止,从而有效地收集所有后代。最终结果提供了 ID 和文件夹名称的嵌套列表,允许检索任意深度级别的所有子文件夹和子子文件夹。

以上是如何使用 MySQL 中的递归查询检索嵌套层次结构中的所有后代文件夹?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn