首页  >  文章  >  数据库  >  如何在MySQL中实现递归文件夹检索?

如何在MySQL中实现递归文件夹检索?

Patricia Arquette
Patricia Arquette原创
2024-11-02 14:47:30189浏览

How to Implement Recursive Folder Retrieval in MySQL?

MySQL 中子文件夹的递归检索

使用分层数据结构时,有必要检索子元素及其子子元素从数据库中。对于代表文件夹的表,需要一个查询来检索给定父文件夹的所有子文件夹。

考虑我们有一个具有以下结构的文件夹表的场景:

CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `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

挑战

给定一个 idFolder,目标是编写一个检索的单个查询其所有子文件夹以及所有子子文件夹递归地。例如:

  • 当 idFolder 为 1 时,结果应为:2, 3, 4, 5, 6, 7
  • 对于 idFolder 4,预期结果为:5, 6, 7
  • 同样,对于 idFolder 3,输出应为:4, 5, 6, 7

解决方案

提供的解决方案利用 MySQL 用户定义变量和子查询的组合来实现递归检索:

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;

说明

查询使用 FIND_IN_SET() 函数检查用户定义变量@pv的值中是否存在当前行的idFolderParent。如果是,则将该值附加到 lv 变量。子查询生成多行,每行代表递归搜索的一个级别。

通过使用带有 SEPARATOR 子句的 GROUP_CONCAT() 函数,每行的结果将被组合并由指定的分隔符分隔(在本例中) , 逗号)。最终结果是一个包含串联子文件夹的字符串。

此解决方案提供了一种强大的方法来递归检索子文件夹和子子文件夹,即使数据库中父文件夹的顺序可能不是严格分层的。

以上是如何在MySQL中实现递归文件夹检索?的详细内容。更多信息请关注PHP中文网其他相关文章!

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