利用MySQL排序将树结构表数据封装成树结构对象

来源:互联网 发布:mac怎么卸载软件 编辑:程序博客网 时间:2024/06/01 23:45

本人菜鸟一个,望大家多多指教
需求:将具备树结构的线性表遍历出来,得到树形结构的对象
解决思路:

  1. 要不查询整条记录,要不查询具备树结构的部分数据。再通过具备树结构的部分数据,将整条记录封装到对象中
  2. 怎么查询具备树结构的部分数据
  3. 首先确定部分数据,我选择记录的id
  4. 那么问题就变成怎么生成具备一定规则的id,又怎么通过规律的读取写入树对象
  5. 通过网上查看http://blog.csdn.net/ACMAIN_CHM/article/details/4142971,可以先通过排序生成一个完全展开的树结构,然后结合树的深度生成一个树的对象
    这里写图片描述
  6. 文章中让我最吃惊的地方是利用MySQL的排序规则来实现树的排序
  7. 那么MySQL的排序又是什么呢?我现在也不清楚
  8. 我这里只把握了一个规律就是,父节点的排序树一定在其所有子节点前面,而且它们是挨着的。假设父节点排序是A,那么它的子节点必定是A[?],根据MySQL的排序,A后面紧接着是A[?]

下面内容来自 http://blog.csdn.net/ACMAIN_CHM/article/details/4142971

方法三:利用中间表和过程

(本方法由yongyupost2000提供样子改编)

创建存储过程如下。由于MySQL中不允许在同一语句中对临时表多次引用,只以使用普通表tmpLst来实现了。当然你的程序中负责在用完后清除这个表。

delimiter //drop PROCEDURE IF EXISTS  showTreeNodes_yongyupost2000//CREATE PROCEDURE showTreeNodes_yongyupost2000 (IN rootid INT)BEGIN DECLARE Level int ; drop TABLE IF EXISTS tmpLst; CREATE TABLE tmpLst (  id int,  nLevel int,  sCort varchar(8000) ); Set Level=0 ; INSERT into tmpLst SELECT id,Level,ID FROM treeNodes WHERE PID=rootid; WHILE ROW_COUNT()>0 DO  SET Level=Level+1 ;  INSERT into tmpLst    SELECT A.ID,Level,concat(B.sCort,A.ID) FROM treeNodes A,tmpLst B     WHERE  A.PID=B.ID AND B.nLevel=Level-1  ; END WHILE;END;//delimiter ;CALL showTreeNodes_yongyupost2000(0);

执行完后会产生一个tmpLst表,nLevel 为节点深度,sCort 为排序字段。
使用方法

SELECT concat(SPACE(B.nLevel*2),'+--',A.nodename)FROM treeNodes A,tmpLst B WHERE A.ID=B.ID ORDER BY B.sCort;
0 0
原创粉丝点击