better_nested_set——用结构设计代替递归

有如下一棵树:

root
|_ Child 1
|_ Child 1.1
|_ Child 1.2
|_ Child 2
|_ Child 2.1
|_ Child 2.2

也可以写成以下结构:

___________________________________________________________________
| Root |
| ____________________________ ____________________________ |
| | Child 1 | | Child 2 | |
| | __________ _________ | | __________ _________ | |
| | | C 1.1 | | C 1.2 | | | | C 2.1 | | C 2.2 | | |
1 2 3_________4 5________6 7 8 9_________10 11_______12 13 14
| |___________________________| |___________________________| |
|___________________________________________________________________|

数字代表左右边界,数据库中表的结构为:

id | parent_id | lft | rgt | data
1 | | 1 | 14 | root
2 | 1 | 2 | 7 | Child 1
3 | 2 | 3 | 4 | Child 1.1
4 | 2 | 5 | 6 | Child 1.2
5 | 1 | 8 | 13 | Child 2
6 | 5 | 9 | 10 | Child 2.1
7 | 5 | 11 | 12 | Child 2.2

选出一个父结点parent的所有孩子:

SELECT * FROM table_name WHERE lft > parent.lft AND lft < parent.rgt

如选出结点Child 1的所有子结点:

SELECT * FROM table_name WHERE lft > 2 AND lft < 7

结果为:

id | parent_id | lft | rgt | data
3 | 2 | 3 | 4 | Child 1.1
4 | 2 | 5 | 6 | Child 1.2

计算一个结点的孩子的数目:

(right - left - 1)/2

选出node结点和它所有的父结点:

SELECT * FROM table_name WHERE node.lft BETWEEN lft AND rgt

如选出结点Child 1.2和它所有的父结点:

SELECT * FROM tabla_name WHERE 5 BETWEEN lft AND rgt

结果为:

id | parent_id | lft | rgt | data
1 | | 1 | 14 | root
2 | 1 | 2 | 7 | Child 1
4 | 2 | 5 | 6 | Child 1.2

这样比递归查询要快多了。
注意:left和right是数据中的保留字
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值