首页  >  文章  >  数据库  >  如何使用单个 SQL 查询检索分层数据库中的所有子文件夹和子文件夹?

如何使用单个 SQL 查询检索分层数据库中的所有子文件夹和子文件夹?

Barbara Streisand
Barbara Streisand原创
2024-11-02 03:00:30380浏览

How to Retrieve All Child and Subchild Folders in a Hierarchical Database using a Single SQL Query?

递归查询检索 MySQL 中的所有子文件夹和子子文件夹

问题:

如何我可以设计一个 SQL 查询来检索分层数据库中给定父文件夹 ID 的所有子文件夹吗?

场景:

考虑一个表文件夹以下结构:

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

问题陈述:

我们要设计一个查询返回给定父文件夹 ID 的所有子文件夹和子文件夹。例如:

  • 对于父文件夹 ID 1,查询应返回 [2, 3, 4, 5, 6, 7]。
  • 对于父文件夹 ID 4,查询应返回应返回 [5, 7, 6]。
  • 对于父文件夹 ID 3,查询应返回 [4, 5, 6, 7]。

解决方案:

以下查询使用递归技术来实现所需的结果:

<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>

解释:

  • 查询使用用户定义的变量 @pv 存储当前级别的以逗号分隔的子文件夹 ID 列表。
  • SELECT 语句中的子查询检索当前级别的子文件夹 ID,并用逗号分隔它们.
  • 然后,外部查询连接所有级别的结果,提供指定父级的所有子文件夹和子文件夹 ID 的逗号分隔列表。

以上是如何使用单个 SQL 查询检索分层数据库中的所有子文件夹和子文件夹?的详细内容。更多信息请关注PHP中文网其他相关文章!

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