mysql存储过程实现无限分类

DROP TABLE IF EXISTS `pcms_channel`;

CREATE TABLE IF NOT EXISTS `pcms_channel` (

  `cid` tinyint(3) unsigned NOT NULL auto_increment,

  `name` char(10) NOT NULL COMMENT '频道名称',

  `parentid` tinyint(4) NOT NULL COMMENT '父级ID',

  `lft` tinyint(4) NOT NULL COMMENT '左值',

  `rgt` tinyint(4) NOT NULL COMMENT '右值',

  `lv` tinyint(3) unsigned NOT NULL default '0' COMMENT '级层',

  `themeid` tinyint(3) unsigned NOT NULL default '1' COMMENT '使用的主题的ID',

  PRIMARY KEY  (`cid`),

  KEY `parentid` (`parentid`,`lft`,`rgt`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--

-- 导出表中的数据 `pcms_channel`

--

INSERT INTO `pcms_channel` (`cid`, `name`, `parentid`, `lft`, `rgt`, `lv`, `themeid`) VALUES

(1, 'phpoocms', 0, 1, 12, 0, 1),

(2, 'test', 1, 2, 7, 1, 1),

(3, 'te', 2, 3, 6, 2, 1),

(4, 'tes', 1, 8, 9, 1, 1),

(5, 'dd', 3, 4, 5, 3, 1),

(6, 'fromphp', 1, 10, 11, 1, 1);
复制代码清空表记录 TRUNCATE TABLE `pcms_channel`
复制代码添加节点到指定节点 DROP PROCEDURE IF EXISTS addChannel//

create procedure addChannel (in pid int,in name varchar(20))

BEGIN

DECLARE pr INT;/*右值*/

DECLARE lvv INT;/*层级*/

DECLARE aff INT;/*计数器*/

DECLARE af INT DEFAULT 0;

SET @result = null;

SELECT `rgt`,`lv` INTO pr,lvv FROM `pcms_channel` WHERE `cid` = pid;

IF pr THEN

START TRANSACTION;

UPDATE `pcms_channel` SET `lft`=`lft`+2 WHERE `lft`>pr;

SELECT ROW_COUNT() INTO aff;

SET af = aff+af;

UPDATE `pcms_channel` SET `rgt`=`rgt`+2 WHERE `rgt`>=pr;

SELECT ROW_COUNT() INTO aff;

SET af = aff+af;

INSERT INTO `pcms_channel` (`name`,`parentid`,`lft`,`rgt`,`lv`) VALUES (name,pid,pr,pr+1,lvv+1);

SELECT ROW_COUNT() INTO aff;

SET af = aff+af;

IF af >= 2 THEN

COMMIT;

SET @result = 1000;

SELECT 1000 AS result;

ELSE

ROLLBACK;

SET @result = 1002;

SELECT 1002 AS result;

END IF;

ELSE

SET @result = 1001;

SELECT 1001 AS result;

END IF;

END//

call addChannel (5,"aa")//
复制代码删除指定节点 DROP PROCEDURE IF EXISTS delChannel//

create procedure delChannel (in pid int)

BEGIN

DECLARE pl INT;

DECLARE pn INT;

DECLARE aff INT;

DECLARE af INT DEFAULT 0;

SET @result = null;

SET @parentid = null;

SET @name = null;

SELECT a.`lft`,IFNULL(COUNT(b.`cid`),0),a.`parentid`,a.`name` INTO pl,pn,@parentid,@name FROM `pcms_channel` AS a LEFT JOIN `pcms_channel` AS b ON a.`cid`=b.`parentid` WHERE a.`cid`=pid GROUP BY b.`parentid`;

IF pl&&!pn THEN

IF pl!=1 THEN

  START TRANSACTION;

  UPDATE `pcms_channel` SET `lft`=`lft`-2 WHERE `lft`>pl;

  SELECT ROW_COUNT() INTO aff;

  SET af = aff+af;

  UPDATE `pcms_channel` SET `rgt`=`rgt`-2 WHERE `rgt`>pl;

  SELECT ROW_COUNT() INTO aff;

  SET af = aff+af;

  DELETE FROM `pcms_channel` WHERE `cid` = pid;

  SELECT ROW_COUNT() INTO aff;

  SET af = aff+af;

  IF af >= 2 THEN

   COMMIT;

   SET @result = 1000;

   SELECT 1000 AS result;

  ELSE

   ROLLBACK;

   SET @result = 1002;

   SELECT 1002 AS result;

  END IF;

ELSE

  SET @result = 1004;

  SELECT 1004 AS result;

END IF;

ELSEIF pn&&pl THEN

SET @result = 1003;

SELECT 1003 AS result;

ELSE

SET @result = 1001;

SELECT 1001 AS result;

END IF;

END//

call delChannel (1)//
复制代码移动节点 DROP PROCEDURE IF EXISTS moveChannel//

create procedure moveChannel (pid int,tid int)

BEGIN

IF pid=1 THEN

SELECT 1004 AS result;

ELSE

IF pid!=tid THEN

  call delChannel (pid);

  IF @result=1000 THEN

   call addChannel (tid,@name);

   IF @result THEN

    SELECT 1000 AS result;

   ELSE

    call addChannel (@parentid,@name);

    SELECT @result AS result;

   END IF;

  ELSE

   SELECT @result AS result;

  END IF;

ELSE

  SELECT 1005 AS result;

END IF;

END IF;

SET @result=null;

SET @parentid=null;

SET @name=null;

END//

call moveChannel (1,1)//
复制代码查询出树状结构 select cid,concat(repeat(" ",lv)) from pcms_channel

时间: 2024-09-22 04:38:20

mysql存储过程实现无限分类的相关文章

php+mysql数据库实现无限分类的方法_php技巧

本文实例讲述了php+mysql数据库实现无限分类的方法.分享给大家供大家参考.具体分析如下: 这款php无限分类代码比较完整理包括了数据库是mysql的,有增加.删除.编辑.移动的功能,同时还提供数据库sql表结构.代码如下: 复制代码 代码如下: //连接数据库 $link = mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('class',$link)or die(mysql_error

php+mysql简单的无限分类栏目

一个非常简单清晰简单的无极限分类范例,带缩进效果,只需查询一次数据表,然后递归遍历结果集,就可以了,要在php中实现栏目缩进显示可以参考一下.  代码如下 复制代码 $sql = 'select * from cat order by cat_id desc'; $list = $db->getAll($sql); $list = getLevelCat($list); function getLevelCat($catlist, $parent_id='0', $html='   ', $le

php+mysql实现无限分类实例详解

 这篇文章主要介绍了php+mysql实现无限分类的方法,实例分析了mysql数据库设计.数据库操作及无限极分类的具体实现步骤,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat,程序实现比较简单,首先我们假设有这样的一个三级分类,新闻→PHP新闻→P

实现PHP+Mysql无限分类的方法汇总

 这篇文章主要给大家汇总介绍了实现PHP+Mysql无限分类的2种方法,并对比分析了2种方法的优劣,需要的朋友可以参考下     无限分类是个老话题了,来看看PHP结合Mysql如何实现. 第一种方法 这种方法是很常见.很传统的一种,先看表结构 表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0 顶级分类的 pid 默认就是0了.当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,

实现PHP+Mysql无限分类的方法汇总_php实例

无限分类是个老话题了,来看看PHP结合Mysql如何实现. 第一种方法 这种方法是很常见.很传统的一种,先看表结构 表:category id int 主键,自增 name varchar 分类名称 pid int 父类id,默认0 顶级分类的 pid 默认就是0了.当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率. 先来构建一个原始数

php+mysql查询实现无限下级分类树输出示例_php技巧

本文实例讲述了php+mysql查询实现无限下级分类树输出.分享给大家供大家参考,具体如下: 这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类.给各位整理了几个php无限分类的例子. 树输出: function get_array($user_id,$top=0){ global $mysql,$_G; $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id

php+mysql数据库无限分类代码

php教程+mysql教程数据库教程无限分类代码 本款php无限分类代码比较完整理包括了数据库是mysql的,有增加.删除.编辑.移动的功能,同时还提供数据库sql表结构. //连接数据库 $link = mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('class',$link)or die(mysql_error()); mysql_query("set names gbk");

php+mysql数据库无限分类代码(1/2)

//连接数据库 $link = mysql_connect('localhost','root','') or die(mysql_error()); mysql_select_db('class',$link)or die(mysql_error()); mysql_query("set names gbk"); //无限分类类库  代码如下 复制代码 class sortclass{ var $data = array(); var $child = array(-1=>ar

PHP带节点操作的无限分类实现方法详解_php技巧

本文实例讲述了PHP带节点操作的无限分类实现方法.分享给大家供大家参考,具体如下: 包含(移动多个节点:移动单个节点:删除多个节点:删除单个节点:新增节点),另附数据库表结构 一.db sql语句 //db used for php无限分类 create table tree( id int(10) not null primary key auto_increment, name varchar(255) not null, lft int(10) not null default 0, rg