kevinqc1989 2013-09-17 08:11 采纳率: 0%
浏览 1460

使用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,如何实现呢
求助各位大神啊!!

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-14 13:44
    关注

    该回答引用ChatGPT

    是的,可以使用 SQL 嵌套查询来实现你的需求。以下是一种可能的解决方案:

    SELECT 
      c1.categoryName AS col1, 
      c2.categoryName AS col2, 
      c3.categoryName AS col3
    FROM 
      categorytree ct
      JOIN category c1 ON ct.categoryID = c1.categoryID
      LEFT JOIN categorytree ct2 ON ct.parentId = ct2.categoryID
      LEFT JOIN category c2 ON ct2.categoryID = c2.categoryID
      LEFT JOIN categorytree ct3 ON ct2.parentId = ct3.categoryID
      LEFT JOIN category c3 ON ct3.categoryID = c3.categoryID
    WHERE 
      ct.id IN (4, 5)
    ORDER BY 
      ct.id;
    

    这个查询的逻辑是,首先从 categorytree 表中获取到叶子节点的信息(这里假设叶子节点的 id 是 4 和 5),然后通过 JOIN 操作和 category 表和 categorytree 表自连接的方式,获取到从叶子节点到根节点的所有分类信息。最后根据 categorylevel 表中的信息,将分类名作为列名进行展示。


    需要注意的是,这个查询假设分类的层级最多有三级,如果需要支持更多层级的分类,需要相应地增加 LEFT JOIN 操作和列名的数量。


    另外,这个查询的效率可能不是很高,因为使用了多次的表自连接操作。如果数据量很大,可能需要通过其他方式进行优化,比如使用递归查询等。

    评论

报告相同问题?

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)