mysql 树的所有路径_mysql-使用sql递归将叶子到树的路径串联成水平列名

我有三张表如下,分别记录类别的树结构、类别信息、类别分类名称:

categorytree:id , parentId , categoryID

category:categoryID,categoryName , level

categorylevel : level , catedorylevelName

外键应该可以看出来吧。

假设表内数据:

categorytree: id parentId categoryID

1 0 1

2 0 2

3 1 3

4 3 4

5 2 7

category: categoryID categoryName level

1 企划 1

2 开发 1

3 年度计划 2

4 项目A 3

7 模块开发 2

categorylevel: level categorylevelName

1 分类一

2 分类二

3 分类三

表结构是为了实现分类的可扩展性和树枝同级的项目名可能重用的考虑,

例如增加到分类四,或年度计划既出现在开发的子项也出现在企划的子项。

父节点ID为零的就是根节点

现在我想根据某个叶子节点,查找出到根节点的路径,然后按分类名作为列值查找出来

例如:查找ID = 4和5 的叶子节点

列:分类一 分类二 分类三

企划 年度计划 项目A

开发 模块开发

列根据categorylevel表确定有几列 叶子节点不一定为第几级别,没有就为空

这样通过sql嵌套查询可以实现吗,我用的数据库是mysql,如何实现呢

求助各位大神啊!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
MySQL中实现递归查找形结构,可以使用递归CTE(Common Table Expression)实现。具体步骤如下: 1. 创建测试数据表 假设我们有一个部门表,包含部门ID和上级部门ID两个字段,用于表示部门之间的层级关系。 ```sql CREATE TABLE department ( dept_id INT PRIMARY KEY, parent_dept_id INT, dept_name VARCHAR(50) ); INSERT INTO department VALUES (1, NULL, '总部'); INSERT INTO department VALUES (2, 1, '财务部'); INSERT INTO department VALUES (3, 1, '市场部'); INSERT INTO department VALUES (4, 2, '会计组'); INSERT INTO department VALUES (5, 2, '出纳组'); INSERT INTO department VALUES (6, 3, '销售组'); ``` 2. 使用递归CTE查询形结构 使用WITH RECURSIVE关键字来定义递归CTE,语法如下: ```sql WITH RECURSIVE cte_name AS ( -- non-recursive term SELECT ... UNION ALL -- recursive term SELECT ... ) SELECT ... FROM cte_name; ``` 其中,cte_name是递归CTE的名称,non-recursive term是第一次执行查询时的结果集,recursive term是后续执行查询时的结果集,UNION ALL用于将两次查询的结果集合并起来。 对于部门表,我们可以使用以下SQL语句查询出所有的部门及其子部门: ```sql WITH RECURSIVE dept_tree AS ( SELECT dept_id, parent_dept_id, dept_name, 0 as level FROM department WHERE parent_dept_id IS NULL -- 根节点 UNION ALL SELECT d.dept_id, d.parent_dept_id, d.dept_name, t.level + 1 FROM department d JOIN dept_tree t ON d.parent_dept_id = t.dept_id -- 子节点 ) SELECT dept_id, parent_dept_id, dept_name, level FROM dept_tree; ``` 解释一下上面的SQL语句: - 第一次执行查询时,从department表中选出parent_dept_id为NULL的记录,即根节点,level为0; - 后续执行查询时,将上一次查询结果中的dept_id作为parent_dept_id,在department表中查找其子节点,同时将level加1; - 重复上述步骤,直到没有子节点为止。 执行上述SQL语句,得到结果如下: ``` +---------+----------------+-----------+-------+ | dept_id | parent_dept_id | dept_name | level | +---------+----------------+-----------+-------+ | 1 | NULL | 总部 | 0 | | 2 | 1 | 财务部 | 1 | | 3 | 1 | 市场部 | 1 | | 4 | 2 | 会计组 | 2 | | 5 | 2 | 出纳组 | 2 | | 6 | 3 | 销售组 | 2 | +---------+----------------+-----------+-------+ ``` 可以看到,结果集中包含了所有的部门及其层级关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值