mysql 根据文件夹id,一条sql语句获取到它本身及所有子文件、孙文件
取决于你的 MySQL 版本。MySQL 8.0 及以上版本可以。使用递归公用表表达式 (Recursive CTE)即可通过一条SELECT语句实现。MySQL 5.7 及以下版本原生不支持。标准邻接表模型id,parent_id无法用一条 SQL 查询无限层级。需要修改表结构如路径枚举法或在代码中递归查询。以下是针对MySQL 8.0的标准解决方案以及旧版本的替代方案。方案一MySQL 8.0 (推荐使用递归 CTE)这是最标准、最优雅的方法。假设你的表结构如下CREATE TABLE folders ( id INT PRIMARY KEY, parent_id INT, -- 根节点的 parent_id 通常为 NULL 或 0 name VARCHAR(255), INDEX idx_parent_id (parent_id) -- 重要必须给 parent_id 加索引 );SQL 语句WITH RECURSIVE FolderTree AS ( -- 1. 锚点成员 (Anchor Member)查询起始文件夹本身 SELECT id, parent_id, name, 0 AS level -- 可选记录层级深度 FROM folders WHERE id 100 -- 这里替换为你要查询的文件夹 ID UNION ALL -- 2. 递归成员 (Recursive Member)查询子节点 SELECT f.id, f.parent_id, f.name, ft.level 1 FROM folders f INNER JOIN FolderTree ft ON f.parent_id ft.id ) -- 3. 最终查询 SELECT * FROM FolderTree;原理解析WITH RECURSIVE: 声明这是一个递归查询。第一部分 (UNION ALL 之前): 先查出 ID 为 100 的那一行根。第二部分 (UNION ALL 之后): 将folders表与刚才查出的结果集 (FolderTree) 进行连接条件是folders.parent_id FolderTree.id。循环: 数据库会不断执行第二部分直到找不到新的子节点为止。结果: 最终返回包含起始节点及其所有后代节点的集合。方案二MySQL 5.7 及以下 (需要修改表结构)如果你无法升级 MySQL 8.0且必须用一条 SQL 查询你需要改变存储层级关系的方式。最常用的是路径枚举法 (Materialized Path)。1. 修改表结构增加一个path字段存储从根节点到当前节点的路径 ID 串。CREATE TABLE folders ( id INT PRIMARY KEY, parent_id INT, name VARCHAR(255), path VARCHAR(1000) -- 例如,1,5,100, );2. 数据示例根节点 (ID 1):path ,1,子节点 (ID 5, 父是 1):path ,1,5,孙节点 (ID 100, 父是 5):path ,1,5,100,3. 查询语句假设你要查询 ID 为100的文件夹及其所有子文件。你需要找到所有path以,1,5,100,开头的记录。-- 首先你需要知道 ID 100 的完整 path 是什么假设它是 ,1,5,100, SELECT * FROM folders WHERE path LIKE ,1,5,100,%;优点: 查询极快支持所有 MySQL 版本一条 SQL。缺点: 移动文件夹时修改父节点需要更新该节点下所有子节点的path字段写入成本高。性能优化与注意事项 (针对方案一)索引至关重要: 务必在parent_id字段上建立索引。否则随着数据量增加递归查询会变得非常慢。ALTER TABLE folders ADD INDEX idx_parent_id (parent_id);防止死循环 (环状引用): 如果数据脏了例如 A 是 B 的父B 又是 A 的父递归会无限循环直到达到 MySQL 的最大递归深度限制默认 1000 层。MySQL 8.0.17: 可以使用CYCLE子句检测循环。通用方法: 在递归部分增加层级限制或者在应用层保证数据不会出现环。查询深度限制: 如果你只想要下 3 层子孙可以在WHERE子句中过滤levelSELECT * FROM FolderTree WHERE level 3;总结需求MySQL 版本解决方案复杂度标准邻接表(id,parent_id)8.0WITH RECURSIVE(推荐)低 (SQL 简单)标准邻接表(id,parent_id)5.7 及更早无法用一条 SQL 实现高 (需代码递归或存储过程)路径枚举表(id,path)所有版本LIKE path%中 (写入复杂读取简单)建议如果条件允许请直接使用MySQL 8.0 的递归 CTE 方案这是目前维护成本最低且性能较好的方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2428645.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!