在 MySQL 中检索分层子数据:多级递归选择
在数据库查询领域,通常需要提取的不仅仅是立即数据子数据以及多级后代信息。这在分层结构中尤其重要,例如组织结构图或嵌套目录系统。
考虑一个名为“Folder”的数据库表,它对文件目录进行建模。每个文件夹都有一个唯一的 ID、名称和可选的父文件夹 ID。我们的最终目标是设计一个查询,给定特定的父文件夹 ID,可以检索其所有子文件夹、子子文件夹等,从而有效地提供全面的分层视图。
查询分析
提供的查询利用 MySQL 的 GROUP_CONCAT() 函数来聚合分层信息。它使用嵌套的 SELECT 语句,通过将子文件夹的 ID 连接到逗号分隔的列表中来迭代检索所有子文件夹。然后,这个列表被存储在变量 lv 中,并用作过滤器来逐步识别子级的其他级别。
最外面的 SELECT 语句只是对每次迭代的子级 ID 的串联列表进行分组,并将它们显示为逗号 -分隔的字符串。通过利用 FIND_IN_SET() 函数,查询可确保在先前识别的子 ID 集合中搜索每个子项。
执行
考虑示例数据集:
idFolder | FolderName | idFolderParent |
---|---|---|
1 | ADoc | NULL |
2 | ADoc1 | 7 |
3 | ADoc2 | 2 |
4 | ADoc3 | 3 |
5 | ADoc4 | NULL |
6 | ADoc5 | 5 |
7 | ADoc6 | 5 |
要检索父文件夹 ID 5 的所有子文件夹及其后代,请执行以下查询:
<code class="sql">SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM ( SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder JOIN (SELECT @pv:=5) tmp ) a;</code>
结果将是所有子文件夹和子文件夹的逗号分隔列表。子子 ID:
6,7,2,3,4
结论
提供的查询提供了一个强大的解决方案来检索 MySQL 中的分层子数据,提供了文件夹结构及其结构的全面视图。嵌套关系。它可以有效地遍历层次结构,而不需要对数据库结构进行任何修改或依赖于父子关系的预定义排序。事实证明,该解决方案在管理复杂的分层数据结构方面特别有价值。
以上是如何使用 MySQL 检索分层结构中的所有后代?的详细内容。更多信息请关注PHP中文网其他相关文章!