`
willko
  • 浏览: 388795 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一次查询完成基于“父id"的无限分类

    博客分类:
  • php
阅读更多
无限分类谈得太多了,无非三种方法“路径”“左右值”“父id”,网上的讨论得比较多,具体实现就不再次讨论了。三种方法,各有优缺点。

“父id”的优点在于实现简单和移动节点简单,缺点在于查询麻烦,毕竟只能针对一层操作。

我想,对于“父id”这种无限分类的查询,多数人都是使用递归来实现了,性能自然不用说,分成n条sql去查询,对mysql的造成不少负载。

如果,仔细考虑下个递归过程,完全可以一次把数据查询出来,然后在程序里循环生成。

每次递归无非是查询一下当前id是否有子节点,然后子节点又递归下去,,也就是只要解决查询某个id是否有子节点就可以完成了。

解决这个问题的方法很简单,使用hash table来查询,键是parent_id值是分类集合,用php实现起来很简单。

假如,有分类如下
system --> linux
system --> unix
system --> windows
system --> windows -> qq
system --> windows -> msn

第一步,查询出所有数据

第二步,重组数据
循环一遍,根据父id集合数据

system => array(linux, unix, windows)
windows => array(qq, msn)

第三步,递归生成
这步,把查询sql改成查hash table。第二步里生成的集合,就是模拟查询的.根据parent_id在hash table里查询。


具体就不实现了,,做网盘的时候,目录我就是使用此方法,因同事不信一次查询能生成树,故写此blog。。
1
0
分享到:
评论
2 楼 willko 2009-06-29  
qchong 写道
你这个也不能叫一次生成树形结构。你从数据库取出来遍历,性能一样不行。。

是“一次查询”生成,,要注意一点,web server比db server容易扩展。
1 楼 qchong 2009-06-29  
你这个也不能叫一次生成树形结构。你从数据库取出来遍历,性能一样不行。。

相关推荐

Global site tag (gtag.js) - Google Analytics