您的位置:首页 > 数据库 > MySQL

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

2016-05-24 10:38 429 查看
本人菜鸟一个,望大家多多指教

需求:将具备树结构的线性表遍历出来,得到树形结构的对象

解决思路:

要不查询整条记录,要不查询具备树结构的部分数据。再通过具备树结构的部分数据,将整条记录封装到对象中

怎么查询具备树结构的部分数据

首先确定部分数据,我选择记录的id

那么问题就变成怎么生成具备一定规则的id,又怎么通过规律的读取写入树对象

通过网上查看http://blog.csdn.net/ACMAIN_CHM/article/details/4142971,可以先通过排序生成一个完全展开的树结构,然后结合树的深度生成一个树的对象



文章中让我最吃惊的地方是利用MySQL的排序规则来实现树的排序

那么MySQL的排序又是什么呢?我现在也不清楚

我这里只把握了一个规律就是,父节点的排序树一定在其所有子节点前面,而且它们是挨着的。假设父节点排序是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;
//
4000

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  结构