mysql学习笔记之层级树

172 阅读2分钟

本次工作目的是构建层次树,将所需数据通过层次树展示出来 本次工作内容有两张表,一张数据表,一张层次树结构表 层次树表需要的字段有HierarchyTreeID,HierarchyTreeType(树类型编码,整棵树的类型编码都是一样的,包括子树),CurrentLevel,ParentID(父节点id),Code(当前节点code),Sort(排序)。 在mybatis.Mapper中的写法如下所示: 首先是select语句,将数据表字段和层次树字段通过连接查询的方式展示出来

     select t1.HierarchyTreeID,
      t1.HierarchyTreeType,
      t3.item_name as HierarchyTreeTypeName,
      t1.CurrentLevel,
      t1.ParentID,
      t1.`Code` ,
      ...(省略)
 ```
1.接下来是获取所有的 HierarchyTreeType='树类型编码'的层次树节点(从根节点出发的层次树)
  ```
      select rd.* from
     (SELECT * FROM  '层次树表' WHERE parentID IS NOT NULL 
     and HierarchyTreeType='树类型编码' ) rd,
 ```
2.然后通过一个自定义变量@pid存储需要的子树的HierarchyTreeID

    ```
     (SELECT @pid := (SELECT HierarchyTreeID FROM  层次树表 
     WHERE `Code`=#{treeCode}(定位需要的子树) and
     HierarchyTreeType='树类型编码')) pd
    ``` 
3.最后是条件语句,此条件语句是①的条件语句
 ```
     WHERE FIND_IN_SET(parentID, @pid) > 0
 ```
至此我们找出来的表 rd 就是当前我们要求的子树的所有一级节点。

4.如果至此我们需要的子树下面还有子树,那我们必须进行递归查找,
 ```
     AND @pid := CONCAT(@pid, ',', rd.HierarchyTreeID)
 ```
该concat将我们查找到的当前树的子节点拼接到@pid变量的后边,就相当于java语句中的 ‘+=’。
至此我们可以找到所有的我们想要的子树下面的所有子树的子节点。最后再将当前节点加上

  ```
 union all
  SELECT * from 层次树表 WHERE `Code`=#{treeCode}
  and HierarchyTreeType='编码'
 ```
5.总结,本次层次树的要求是获取根节点下面的某个节点代表的子树,并非是整个层次树,所以再第二步的时候通过一个变量@pid进行了二次查找,所以最终得到的rd是所需要的子树的所有节点,不是根节点代表的树的节点,如果是想要整个树的节点,将第二步的变量设到第一步中即可。