首页 新闻 会员 周边 捐助

sql如何高效查询某节点下的所有叶子节点?

0
悬赏园豆:40 [已解决问题] 解决于 2016-08-07 23:02

sql如何高效查询某树形节点下的所有叶子节点?

 

表结构

id node pid

wongdavid的主页 wongdavid | 菜鸟二级 | 园豆:394
提问于:2014-12-13 14:23
< >
分享
最佳答案
1
with cte as 
(
select * from 表名 where pid=union all
select  a.* from 表名 as a,cte as b where a.pid=b.id
)
select * from cte
收获园豆:40
会飞的金鱼 | 小虾三级 |园豆:881 | 2014-12-13 17:56

你这个是读取树结构的吧,并不是查找叶子节点啊

wongdavid | 园豆:394 (菜鸟二级) | 2014-12-13 19:46

@wongdavid: 就是这种方法,关键字叫做cte递归,你网上搜一下,一大把的

空明流光 | 园豆:111 (初学一级) | 2014-12-16 13:10
其他回答(6)
0

cte,你懂的~

幻天芒 | 园豆:37207 (高人七级) | 2014-12-13 14:48
0

如果要区分树干和树叶,建议设计数据表时就增加字段区分。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-14 08:34
0

id:标识

node:节点名称

pid:父节点标识及id

例如:

id    node    pid

0      中国     -1

1      北京     0

2      海淀区  1

3      昌平区  1

如果你要查找北京这个节点下的所有区

你可以这样 select id,node,pid where pid=1

wolfy | 园豆:2636 (老鸟四级) | 2014-12-14 13:49
0

select * from [表名]

where pid in (select id from [表名])

帅到京东中央、 | 园豆:104 (初学一级) | 2014-12-14 21:34
0

类似这样的,一般我们都是这样设计数据库:id node pid code

code用于存储本节点的编码。节点编码=父节点编码+节点编码。

例如

父节点100,对应自己点100101,100102

父节点101,对应自己点101101,101102

然后就可以通过LIKE匹配查询了。

lucika.zh | 园豆:54 (初学一级) | 2014-12-15 13:24
2

 在建一个字段,存节点层级信息

 存放数据如 1-2-5-19 ,其中 19 为当前节点的父节点,5为19的父节点,2为5的父节点,1为顶级节点。

 这么设计的好处是:

 1. 你可以根据任何一个父节点来找他下面所有的子节点及子节点下的子节点,like一下就出来了

 2. 可以根据任何一个子节点来找他上级节点,上级的上级,直到顶级节点,只需根据这个字段拆分下就行而不需要做数据库查询。

 

xmj112288 | 园豆:126 (初学一级) | 2014-12-16 20:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册