mysql无限极的设计方式

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>

结果如下:

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值