• 1
  • 2
  • 3
  • 4
  • 5
mysql数据库问题 首 页  »  帮助中心  »  数据库  »  mysql数据库问题
PHP与MySQL 无限分类实现的两种方法
发布日期:2016-4-16 11:4:44

 PHP与MySQL 无限分类实现的两种方法

  无限分类是个老话题了,PHP和MySQL中实现无限分类的思路也有许多种,本文主要介绍其中2种最巧妙的无限分类方法,一起来看看吧。

  方法一:

  这种方法是一种很常见、很传统的方法,我们先看表结构

  表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0

  顶级分类的 pid 默认就是0了。当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,考虑到效率的问题不建议每次递归都查询数据库,先将所有分类取出来是通常的做法,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率。

  先来构建一个原始数组,这个直接从数据库中拉出来就行,如图1所示:


  图1

  目标是将它转化为下面的这种结构

  电脑 —笔记本 ——-超级本 ——-游戏本 —台式机 手机 —智能机 —功能机

  用数组来表示的话,可以增加一个 children 键来存储它的子分类,如图2所示:


  图2

  处理过程,如图3所示:


  图3

  打印结果如下,如图4所示:


 图4

  •   优点:关系清楚,修改上下级关系简单。
  •   缺点:使用PHP处理,如果分类数量庞大,效率也会降低。

  方法二:

  第二种方法是在表字段中增加一个path字段:

  表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0 path varchar 路径

  示例数据,如下所示:

  id name pid path 1 电脑 0 0 2 手机 0 0 3 笔记本 1 0-1 4 超级本 3 0-1-3 5 游戏本 3 0-1-3 path字段记录了从根分类到上一级父类的路径,用id+’-‘表示。

  这种方式,假设我们要查询电脑下的所有后代分类,只需要一条sql语句,如下所示:

  select id,name,path from category where path like (select concat(path,’-‘,id,’%’) as path from category where id=1); 结果:

  +—-+———–+——-+ | id | name | path | +—-+———–+——-+ | 3 | 笔记本 | 0-1 | | 4 | 超级本 | 0-1-3 | | 5 | 游戏本 | 0-1-3 | +—-+———–+——-+ 这种方式也被很多人所采纳,我总结了下:

  •   优点:查询容易,效率高,path字段可以加索引。
  •   缺点:更新节点关系麻烦,需要更新所有后辈的path字段。

  转载请注明:玩赚乐 » PHP + MySQL 无限分类实现的2种方法