一次查询完成基于“父id"的无限分类
2009-06-26 13:15
302 查看
无限分类谈得太多了,无非三种方法“路径”“左右值”“父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集合数据
系统 => array(linux, unix, windows)
window => array(qq, msn)
第三步,递归生成
这步,把查询sql改成查hash table。第二步里生成的集合,就是模拟查询的.根据parent_id在hash table里查询。
具体就不实现了,,做网盘的时候,目录我就是使用此方法,因同事不信一次查询能生成树,故写此blog。。
“父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集合数据
系统 => array(linux, unix, windows)
window => array(qq, msn)
第三步,递归生成
这步,把查询sql改成查hash table。第二步里生成的集合,就是模拟查询的.根据parent_id在hash table里查询。
具体就不实现了,,做网盘的时候,目录我就是使用此方法,因同事不信一次查询能生成树,故写此blog。。
相关文章推荐
- mysql中从子类ID查询所有父类(做无限分类经常用到)
- 数据库连接,有时会出错在conn.open connstr这地方的问题,及联接查询调用rs("user.id")的问题2006-6-8-4
- mysql中从子类ID查询所有父类(做无限分类经常用到)
- mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)
- javascript-replace()基础,一次完成将"<,>"替换"<>"实例
- 基于U-boot完成NandFlash裸板程序烧写(DNW&TFTP)
- 解决 Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat
- 开发日志:使用jquery读取id含./"等特殊符号的对象
- [转]用 document.readyState == "complete" 判断页面是否加载完成。
- 查询流程状态不等于处理完成的人员ID
- [jQuery][css]通过$("#id").width();设置元素宽度在火狐无效
- window.document.execCommand("SaveAs",false,id+".xls"); 在IE7下的问题
- "基于对象" 和 "面向对象"
- 搭建基于hadoop 2.2.0的分布式集群启动时出现 "Unable to load native-hadoop library for your platform" 的解决方案
- )Name or service not known: mod_unique_id: unable to find IPv4 addr ess of "wb_three_cgi20"
- 用 document.readyState == "complete" 判断页面是否加载完成
- 一次表单提交失败 --- 内的name="action"的元素引起
- 以"x1,x2,x3,x4"方式的查询
- 针对网上流传的"Android 再按一次后退键退出应用程序"方法改正
- Request.Cookies["User_ID"]使用注意事项