方案一:

表结构:

id int primary key auto_increment;

name varchar(40);

pid int default 0; #父类id,默认值为0

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

优点:关系清楚,修改上下级关系简单

缺点:使用PHP处理,如果分类信息数量庞大,效率也会降低

方案二:

在表字段中增加一个 path 字段

id int primary key auto_increment;

name varchar(40);

pid int default 0; #父类id,默认值为0

path varchar(255); #记录从根分类到父类的路径,eg:0-1-5,数字是id

示例数据:

id        name        pid        path

1         电脑         0           0

2         手机         0           0

3         笔记本     1           0-1

4         超级本     3           0-1-3

5         游戏本     3           0-1-3

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

select id,name from category where path like ( select concat(path,'-',id,'%') path from category where id=1 );

优点:查询容易,效率高,path字段可以加索引。

缺点:更新节点关系麻烦,需要更新所有后辈的path字段。

方案一的样例代码:

<?php

$addrs = array(

array('id'=>1, 'name'=>'中国', 'pid'=>0),

array('id'=>2, 'name'=>'河南', 'pid'=>1),

array('id'=>3, 'name'=>'郑州', 'pid'=>2),

array('id'=>4, 'name'=>'洛阳', 'pid'=>2),

array('id'=>5, 'name'=>'安阳', 'pid'=>2),

array('id'=>6, 'name'=>'林州', 'pid'=>5),

array('id'=>7, 'name'=>'安阳县', 'pid'=>5),

array('id'=>8, 'name'=>'内黄', 'pid'=>5),

array('id'=>9, 'name'=>'滑县', 'pid'=>5),

array('id'=>10, 'name'=>'城郊乡', 'pid'=>6),

array('id'=>11, 'name'=>'湖南', 'pid'=>1),

array('id'=>12, 'name'=>'长沙', 'pid'=>11),

array('id'=>13, 'name'=>'湘潭', 'pid'=>11),

array('id'=>14, 'name'=>'岳麓区', 'pid'=>12),

);

// 查询子树

function get_childs($id)

{

global $addrs;

$ret = array();

foreach($addrs as &$addr)  // 此处使用 & 运算符,提高效率

{

if($addr['pid'] == $id)

{

$addr['children'] = get_childs($addr['id']);

$ret[] = $addr;

}

}

return $ret;

}

// test code

echo '<pre>';

print_r( get_childs(1) );

echo '<hr/>';

print_r($addrs);

PHP+MySQL 无限级分类的两种实现方案相关推荐

  1. dapper mysql 批量_MySQL数据库之c#mysql批量更新的两种方法

    本文主要向大家介绍了MySQL数据库之c#mysql批量更新的两种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 总体而言update 更新上传速度还是慢. 1:  简单的 ...

  2. ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK)

    ML之分类预测之ElasticNet:利用ElasticNet回归对二分类数据集构建二分类器(DIY交叉验证+分类的两种度量PK) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 # ...

  3. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...

    本文主要向大家介绍了MySQL数据库之修改mysql默认字符集的两种方法详细解析 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. (1) 最简单的修改方法,就是修改mysql的m ...

  4. php 无限极分销,PHP实现无限极分类的两种方式

    无限极分类说简单点就是一个类可以分成一个分子类,然后一个子类又可以分另一个子类这样无限分下去,就是好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一个文件夹,PHP要实现无限极分类有两 ...

  5. mysql 时间查询_两种常用MySql查询时间段的方法

    MySql查询时间段的方法很多,下面就为您介绍几种最常用的MySql查询时间段方法,如果您在MySql查询时间段方面遇到过问题,不妨一看. MySql的时间字段有date.time.datetime. ...

  6. mysql安装文件格式_一、安装方式       MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的。下面来看看这两种方式:       MSI格式的可以直接点击安...

    一.安装方式 MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的.下面来看看这两种方式: MSI格式的可以直接点击安装,按照它给出的安装提示进行安装,Windows操作系统下一般MyS ...

  7. mysql复制表的两种方式

    mysql复制表的两种方式. 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二 ...

  8. memcached 穿透mysql_memcached 和 mysql 结合使用的两种实现选择?

    memcached 和 mysql 结合使用的两种实现选择? 这是我在知乎上抛出的一个问题"我们的应用已经决定采mysql+memcached 的方式,针对的数据库版本是 mysql 5.1 ...

  9. android 热更新 方案,热更新-热更新app开发的两种系统方案!

    针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...

最新文章

  1. Python 在定义函数时 为什么默认参数不能放在必选参数前面
  2. 剑指offer:二叉树的镜像
  3. 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
  4. Android 单击+双击+短按+长按 逻辑
  5. linux git 修改文件,关于linux:Git删除所有未修改的文件
  6. Android插件化开发之动态加载的类型
  7. vb.net中东软医保接口的调用
  8. WPF 后台访问资源图片
  9. 60-320-040-使用-去重-HyperLogLog 去重计数
  10. 当联邦学习碰上老虎机
  11. SQL server 表中如何创建索引?
  12. 12.使用hashcat暴力破解加密office文档密码
  13. CodeMeter:软件加密的“木桶定律”
  14. asp实现注册登录界面_(01)ASP运行环境的搭建
  15. 评价法(一):层次分析法的步骤和方法
  16. python输入名字配对情侣网名_输入名字配置情侣网名-网名搜索
  17. keil格式化代码方法
  18. 超宽带雷达P440?雷达的快时间慢时间是什么意思?
  19. 蓝牙共享PC宽带上网
  20. 1. 微信公众号申请

热门文章

  1. android.os.Build的一些使用方法
  2. electron实现远程更新
  3. 广告联盟是什么,其优势有哪些?
  4. 十二五中国电信宽带战略解析(四):主导与包容
  5. hardmard积 用什么符号表示_复数域符号相乘的差分网络编码
  6. php关联规则,如何理解关联规则apriori算法
  7. 图与排列、图的存在性
  8. 第一章 初识OpenHarmony
  9. 艾永亮:分析瑞幸咖啡的商业模式,超级产品战略为企业带来新机会
  10. Android定位元素与操作