<code>select * from tree where lft between 2 and 11;<br><br></code>
<img style="border: 0;" src="http://www.blogjava.net/images/blogjava_net/lijie250/table03.gif" border="0" alt="" width="243" height="130"><br>看到了吧,只要一个查询就可以得到所有这些节点。为了能够像上面的递归函数那样显示整个树状结构,我们还需要对这样的查询进行排序。用节点的左值进行排序:
<code>select * from tree where lft between 2 and 11 order by lft asc;</code>
那么某个节点到底有多少子孙节点呢?很简单,子孙总数=(右值-左值-1)/2 <br>descendants = (right – left - 1) / 2 ,如果不是很清楚这个公式,那就去翻下书,我们在上数据结构写的很清楚!<br><br>添加同一层次的节点的方法如下:
<span style="color: #000000;"></span>
lock table nested_category write;select @myright := rgt from nested_categorywhere name = 'cherry';update nested_category set rgt = rgt + 2 where rgt > @myright;update nested_category set lft = lft + 2 where lft > @myright;insert into nested_category(name, lft, rgt) values('strawberry', @myright + 1, @myright + 2);unlock tables;
<br>添加树的子节点的方法如下:
<span style="color: #000000;"></span>
lock table nested_category write;select @myleft := lft from nested_categorywhere name = 'beef';update nested_category set rgt = rgt + 2 where rgt > @myleft;update nested_category set lft = lft + 2 where lft > @myleft;insert into nested_category(name, lft, rgt) values('charqui', @myleft + 1, @myleft + 2);unlock tables;
<br>每次插入节点之后都可以用以下sql进行查看验证:
<span style="color: #000000;"></span>
select concat( repeat( ' ', (count(parent.name) - 1) ), node.name) as namefrom nested_category as node,nested_category as parentwhere node.lft between parent.lft and parent.rgtgroup by node.nameorder by node.lft;
<br>删除节点的方法,稍微有点麻烦是有个中间变量,如下:
<span style="color: #000000;"></span>
lock table nested_category write;select @myleft := lft, @myright := rgt, @mywidth := rgt - lft + 1from nested_categorywhere name = 'cherry';delete from nested_category where lft between @myleft and @myright;update nested_category set rgt = rgt - @mywidth where rgt > @myright;update nested_category set lft = lft - @mywidth where lft > @myright;unlock tables;;
这种方式就是有点难的理解,但是适合数据量很大规模使用,查看所有的结构只需要两条sql语句就可以了,在添加节点和删除节点的时候略显麻烦,不过相对于效率来说还是值得的,这次发现让我发现了数据库结构真的很有用,但是我在学校学的树基本上都忘记了,这次遇到这个问题才应用到项目中!
应用到我的小站上 http://news.wangmeng.cn/<br><br>参考文章:<br>http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
http://www.sitepoint.com/article/hierarchical-data-database/3/