深度未知的层次结构在现实生活中经常出现,比如公司的员工组织关系、地域关系、文件系统中的树形结构等等,在展示的时候都可以很清楚的看到上下之间的关系。那么后台又是如何实现的呢。接下来介绍两种方法。
第一种:按编码从小到大的方式排序(展示比较容易)
用两列实现,第一列表示编码,第二列表示级数,比如
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