mysql 无限级分类

两种思路吧,递归 和 非递归

递归

$arr = [
    1=>[‘id‘=>1,‘pid‘=>0],
    2=>[‘id‘=>2,‘pid‘=>0],
    3=>[‘id‘=>3,‘pid‘=>1],
    4=>[‘id‘=>4,‘pid‘=>1],
    5=>[‘id‘=>5,‘pid‘=>0],
    6=>[‘id‘=>6,‘pid‘=>3],
    7=>[‘id‘=>7,‘pid‘=>6],
    8=>[‘id‘=>8,‘pid‘=>3],
    9=>[‘id‘=>9,‘pid‘=>4],
    10=>[‘id‘=>10,‘pid‘=>7],
    11=>[‘id‘=>11,‘pid‘=>7],
];

//排序数组arr 层数level  键val
function display_test($arr,$level,$val){

    if($level==0)
    {
        echo "顶级目录\n";
    }else{
        echo str_repeat(‘    ‘,$level).$arr[$val][‘id‘]."\n";
    }
    $temp = get($arr,$val);
    foreach ($temp as $v)
    {
        display_test($arr,$level+1,$v[‘id‘]);
    }
}

//获取 pid的所有下一级子节点
function get($arr,$pid)
{
    $res = [];
    foreach ($arr as $v)
    {
        if($v[‘pid‘]==$pid)
        {
            $res[] = $v;
        }
    }
    return $res;
}

display_test($arr,0,0);die;

  

非递归 左右值法

表结构

CREATE TABLE `sys_department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL COMMENT ‘部门名称‘,
  `description` varchar(200) DEFAULT NULL COMMENT ‘描述‘,
  `create_time` int(11) DEFAULT NULL COMMENT ‘添加时间‘,
  `left_value` int(11) DEFAULT NULL,
  `right_value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=‘部门表‘

  

添加新下级:用事物

//修改右值
            $sql = "UPDATE {$this->table} SET right_value = right_value+2 WHERE right_value>=:right_value";

//修改左值
            $sql = "UPDATE {$this->table} SET left_value = left_value+2 WHERE left_value>=:left_value";

//插入
$sql = "INSERT INTO {$this->table}(name,description,left_value,right_value,create_time) VALUES(:name,:description,:left_value,:right_value,:create_time)";

  

删除节点: 用事物

//删除
        $sql = "DELETE FROM {$this->table} WHERE left_value>=:left_value AND right_value<=:right_value";

//修改左值
            $sql = "UPDATE {$this->table} SET left_value=left_value-{$offset} WHERE left_value>:left_value";

//修改右值
            $sql = "UPDATE {$this->table} SET right_value=right_value-{$offset} WHERE right_value>:right_value";

  

获取所有节点,包含缩进

public function display_tree($id){
    //获取节点
        $model = $this->model->getById($id);
        if(!$model)
        {
            return false;
        }
        $left = $model[‘left_value‘];
        $right = $model[‘right_value‘];

//获取子节点  按left_value排序
        $res = $this->getByLeftRight($left,$right);
        $temp = [];
//循环找出节点所在级数
        foreach ($res as $k=>$v)
        {
            if(count($temp)>0)
            {
                // 检查我们是否应该将节点移出堆栈
                while ($temp[count($temp) - 1] < $v[‘right_value‘]) {
                    array_pop($temp);
                }
            }
            //echo str_repeat("*",count($temp)).$v[‘name‘]."\n";
            $res[$k][‘level‘] = count($temp);
            $temp[] = $v[‘right_value‘];
        }
        //level 第几层
        return $res;
    }

  

时间: 2024-10-21 10:14:13

mysql 无限级分类的相关文章

mysql无限级分类实现基于汇报关系的信息管理权限

汇报关系和家族族谱的实现类似,采用树的数据结构进行定义,树采用递归进行定义.即要嘛是一个根节点,要嘛是由一个根节点和其子树组成.OA中的汇报关系也采用这种结构(与树稍有不同),除董事长外,其他人有且只有一个非其本人的直接主管,董事长的直接主管和越级主管是其本人.从以上的定义其实可以看出,汇报关系类似树,但又与树并不完全相同.除董事长外,其他汇报关系均是树形结构.树形结构采用递归定义,如采用递归查询是非常耗时的操作.比如以下需求: 1.主管可以看到所有直线下属的绩效信息: 针对以上需求,我们提出三

mysql 无限级分类实现思路

第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组或者对象进行递归.本身负荷还是没太大问题.但是如果分类到更多级,那是不可

MYSQL无限级分类表设计及自我连接

我们有这样一个需求: 做一个城市联动,比如说贵州省,省下面有众多市,市下面有众多区县,区县下面有众多镇,如果用多张表来存储,必然是能够简单的实现联动效果,但是多表的联合查询必然会影响到一些效率,此时可以考虑 用一张表来实现. 还有当我们要分的级数是不确定的,或者是很多的,那么建立多张表也是不合理的设计. 如何用一张表来存储呢? 该表的建立代码如下: 1 create table city(id smallint unsigned auto_increment primary key, 2 cit

MySQL基础入门学习【9】无限级分类表设计

比如: 图书/小说.文学.../四大名著.戏曲.../... 理论上可以设计很多张表: 但是随着分类逐步增多,这些表的数目不可能无限扩展: 所以对于无限级分类表一般我们采用如下形式(通过自身的连接来实现的): 这个例子中我们至少设计三个字段: 分类的id.分类的名称.父类的id. 插入记录: INSERT tdb_goods_types(type_name,parent_id) VALUES('家用电器',DEFAULT); INSERT tdb_goods_types(type_name,pa

MySQL技巧(二)——无限级分类表设计

无限级分类表的设计(掌握'自身连接') 类似图书这种,会有很多种分类,而且在现实生活中这种分类会无限的往下分,所以不可能每有一个分类就创建一个分类表.应该使用下面这种语句 DROP TABLE IF EXISTS tdb_goods_types; CREATE TABLE tdb_goods_types( type_id SMALLINT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID', type_name VARCHAR(50) COMMENT '分类名称'

(实用篇)PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. 首先

PHP无限级分类-递归(不推荐)

[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义

左右值编码,文章类别。无限级分类

在网上也搜了很多的例子,根据网络上的解释,慢慢摸索,用了将近2周的时间.笨人,没办法.有什么错的 请留言哦. 在yii php框架下 无限级分类. 通过网络上的,我们都了解到 实现文章 无限级分类,可以使用左右值编码,是通过二叉树的先序遍历 来得到 类别的,不使用递归.这种方法在 全部查询出 类别的时候,是很简单的. 先看数据库表格的设计. id name lft rht father_id layer 1 顶级分类 1 4 0 0 2 网站底部 2 3 1 1 注释: id --- 类别id

PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. My