MYSQL 无限级 分类设计
前言: 无限级实现的方式很多,以往常常使用 递归查询 或者 查询后 数组拼装来解决, 本次介绍的为 mysql 设置排序字段方式来解决
原理: 字符型的比较是通过 ASCII 从左向右逐个比较, 直到某一处 比较出结果才停止 , 通过这样的规律 我们可以发现, 越是排列和值越是相似的字符串将 比较的次数越多 例如 ‘0123456’ <=> ‘01234567’ , 同时我们也可以发现 这样的值排序后的位置也越靠近
结果: 在表里面设置 path 字段 用于存储该记录的路径 , 通过对路径的排序将相同类的数据排列在一起
声明: 这样的排序可以很方便的分页查询 , 但是如果有结构上的要求还是需要重新组装成树形结构.
CREATE TABLE `bsa_category` (
`id` int(11) NOT NULL,
`name` varchar(64) DEFAULT NULL,
`pid` int(11) NOT NULL DEFAULT '0',
`path` varchar(255) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
重点说明:
- path 字段用于排序,存储内容为 他的路径,例如 0,1,3 则代表 他的上级分布情况
- level 字段用于表示该分类的等级, 1代表一级 2代表二级
查询的时候, 根据 path 字段来排序, 由于path类型为 字符型 , 所以会按照 编码来排序,路径相似的将会排在一起
$res = Db::table('bsa_category')
->order('path')
->select();
// str_repeat (str,int) = int 个 str
// str_repeat ('--|',2) = --|--|
foreach ($res as $k=>$v){
$res[$k]['name'] = str_repeat('|-----',$v['level'] - 1).$res[$k]['name'];
}
<select name="" id="">
{foreach $list as $key=>$vo }
<option value="">{$vo.name}</option>
{/foreach}
</select>
结果如下: