如何查询folder_table中同ID带linenum序列的文件夹数据?
生成面包屑ParentID数组的实现方法
根据你描述的嵌套文件夹归档系统需求,分两种常见表结构场景给出实现方案:
场景1:表存储独立文件夹节点(每个节点一条记录,通过parent_id关联层级)
如果folder_table中每个文件夹是独立记录,通过parent_id关联父文件夹,linenum表示节点在路径中的顺序编号,可以用递归CTE遍历层级并聚合数组:
WITH RECURSIVE breadcrumb_cte AS ( -- 起始节点:目标文件夹 SELECT id, parent_id, linenum, ARRAY[parent_id] AS parent_ids FROM folder_table WHERE id = :target_id -- 替换为目标文件夹ID UNION ALL -- 递归向上遍历父节点 SELECT ft.id, ft.parent_id, ft.linenum, bc.parent_ids || ft.parent_id FROM folder_table ft JOIN breadcrumb_cte bc ON ft.id = bc.parent_id WHERE ft.parent_id IS NOT NULL ) -- 按linenum排序聚合最终数组 SELECT array_agg(parent_id ORDER BY linenum) AS breadcrumb_parent_ids FROM breadcrumb_cte;
场景2:表存储完整路径的所有节点(同一路径节点共用id,linenum为路径顺序)
如果同一文件夹路径的所有层级节点共用同一个id,linenum代表路径中的顺序(从根到子节点递增),直接用聚合函数即可生成数组:
SELECT id, array_agg(parent_id ORDER BY linenum) AS breadcrumb_parent_ids FROM folder_table WHERE id = :target_id -- 替换为目标ID GROUP BY id;
补充调整
- 若需排除根目录的
NULL值,可在查询中添加AND parent_id IS NOT NULL条件; - 若
linenum是倒序(子节点到根目录),只需将ORDER BY linenum改为ORDER BY linenum DESC。
内容的提问来源于stack exchange,提问作者Culascage
相关产品推荐
相关产品推荐

