如何定义深度未知的层次结构

深度未知的层次结构在现实生活中经常出现,比如公司的员工组织关系、地域关系、文件系统中的树形结构等等,在展示的时候都可以很清楚的看到上下之间的关系。那么后台又是如何实现的呢。接下来介绍两种方法。

第一种:按编码从小到大的方式排序(展示比较容易)

用两列实现,第一列表示编码,第二列表示级数,比如

00 1

0001 2

0002 2

000101 3

。。。

那么在展示的时候只需要按照编码从小到大排序即可,但是这里有一个问题就是如何判断当前结点是否为叶子结点,这里采用的方法是判断当前值与下一个值是否具有子串的关系,如果有,则不是;否则是叶子结点。

第二种:自引用的父子关系(sql 不好实现)

也是用两列实现,第一列表示自增的主键id,第二列引用第一列parentid,比如

1 1

2 1

3 1

4 2

...

那么在展示的时候需要知道其最大深度,有n级则inner join n-1次。
可以从最低级向最高级inner join:每次保留parentid即可
或可以从最高级向最低级inner join:每次保留id即可。

比如:

--从高级向低级查找
select E.id,level1,level2,level3,E.name as level4 from (
select D.id,level1,level2,D.name as level3 from (
select B.id,A.name level1,B.name level2 from 
region as A inner join region as B
on A.id=B.parentid) as C inner join region as D
on C.id=D.parentid) as D inner join region as E
on D.id=E.parentid


--从最低级向最高级查找
select F.parentid,F.name level1,level2,level3,level4 from 
(
select D.parentid,D.name level2,level3,level4 from
(
select A.parentid,A.name level3,B.name level4 from 
region as A inner join region as B
on A.id=B.parentid) as C inner join region as D
on C.parentid=D.id) as E inner join region as F
on E.parentid=F.id


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值