无限分类谈得太多了,无非三种方法“路径”“左右值”“父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。。
分享到:
相关推荐
PHP语言无限分类根据子id获取的父级的id代码,简单明了。
首先,无限级分类的核心在于每个分类都有一个父分类ID,通过这个字段可以构建层级关系。在SQL数据库中,我们可以创建一个包含以下字段的`categories`表: 1. `id`: 分类ID,主键,自增。 2. `name`: 分类名称。 3. ...
添加分类时,用户需要指定父分类,这可以通过选择器或者输入父分类ID来完成。修改分类可能涉及到更新`parent_id`或其他分类属性。删除分类则需要考虑到分类的子分类,通常会有一个确认过程以防止误删,并确保删除...
无限分类通常基于树形结构,每个节点都有一个父节点(除了根节点),并且可以有任意数量的子节点。在数据库设计中,通常会用到自引用关联,即分类表中的一个字段(如`parent_id`)引用同一表的主键,表示当前分类的...
1. **构建无限分类数据结构**:首先,我们需要一个包含分类ID、父ID和分类名的数据源,通常来源于数据库查询。然后,我们可以通过比较每个分类的父ID与其它分类的ID,构建一个嵌套的关联数组,其中键是分类ID,值是...
无限分类通常基于自引用关联或层级标识符(如“路径”或“深度”)来实现。在这个例子中,可能使用了后者,即通过在数据库中为每个分类添加一个表示其在分类树中的位置的字段,如`parent_id`和`level`。`parent_id`...
文中提出的优雅解决方案是通过一次性查询所有分类,构建一个`id => pid`的关联数组,并将其缓存。然后,利用这个数组通过`while`循环不断查找上级分类,直到找到`pid`为0的顶级分类。这种方法避免了多次数据库查询,...
AjaxPro无限级分类联动是一种基于Ajax技术和JavaScript的交互式网页设计模式,主要用于构建动态、无需刷新页面即可更新内容的级联菜单系统。这种技术在网站的导航、商品分类或者层级结构展示等方面非常实用,能够...
为了提高查询效率,可以使用预加载或关联查询(如Eloquent ORM的`with('children')`)一次性获取所有分类及其子分类。此外,可以使用`LEFT JOIN`查询,避免因递归导致的多次数据库访问。 5. **动态级联效果** 在...
一个常见的设计是使用一个名为`categories`的表,包含字段如`id`(主键,唯一标识每个分类)、`name`(分类名称)、`parent_id`(父分类ID,用于表示分类层级关系)。当`parent_id`为0时,表示顶级分类;非0时,表示...
1. 数据结构:首先,我们需要定义一个数据结构来存储分类信息,这通常是一个对象数组,每个对象包含分类的ID、名称、父分类ID等属性,以及可能的子分类数组。 2. 递归处理:在JavaScript中,递归函数是构建无限级...
无限分类通常基于树状结构,每个节点都可以有任意数量的子节点,形成一个无限级别的分类层次。在数据库设计中,常见的实现方法有两种:使用自引用字段(self-referential)或使用路径枚举法(Path Enumeration)。自...
- 数据库设计:通常需要一个包含`id`(主键)、`parent_id`(父分类ID)、`name`(分类名称)等字段的分类表。有时为了提高查询效率,还会添加额外的字段,如`path`(分类路径)或`level`(层级深度)。 - 查询优化...
1. **获取全部分类**:函数可能能一次性返回所有的分类,包括它们的层级关系。 2. **按层级遍历**:能够按照层级顺序逐级展示分类,这对于构建多级导航菜单非常有用。 3. **根据父类别获取子类别**:可以根据指定的...
2. **数据库设计**:在`test.sql`中,通常会创建一个如`categories`的表,包含`id`(主键)、`name`(分类名)、`parent_id`(父分类ID)和`level`(层级)等字段。`parent_id`字段用于建立父子关系,`level`字段则...
对于无限级分类,通常会使用自引用的关联表,其中每个分类都有一个父分类ID字段,表示其上级分类。这样,通过递归查询或自连接查询,我们可以获取到任意级别的子分类。 文件`addshangpinlei.php`可能是一个用于添加...
最后,`sp_Column_List.sql` 存储过程可能是用于列出所有分类,或者根据特定条件(如父ID)筛选出一部分分类。在无限级分类中,列出所有的节点通常需要递归查询,从根节点开始,逐级展开其子节点。这个过程可能会...
这种方法的优点在于效率高,因为只需要一次遍历和有限次的存储过程调用,而不会随着层级的增加而增加查询次数。缺点是存储过程的编写和维护可能相对复杂,特别是当需要支持复杂的分类操作时。 在实际应用中,还可以...
递归的关键在于定义一个函数,它接受分类ID作为参数,查询数据库获取该分类及其子分类,然后对每个子分类再次调用函数,直到没有子分类为止。这种方法简单易懂,但当分类数量很大时,可能会导致大量的函数调用,影响...
- **数据库设计**:在数据库中,通常会有一个分类表,包含分类ID、分类名称、父分类ID等字段。父分类ID为0或NULL表示顶级分类。 - **查询与遍历**:通过查询所有分类,并根据父分类ID进行递归遍历,构建出层级结构...