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

mysql 存储过程 无限分类_mysql存储过程实现无限分类相关推荐

  1. mysql 存储过程 定义数组_MySql存储过程

    Mysql进阶 存储过程 1 什么是存储过程 1.存储过程,带有逻辑的sql语句 2.之前的sql没有条件判断,没有循环 3.存储过程带上流程控制语句(if while) 2 存储过程特点 1)执行效 ...

  2. mysql 存储过程建表_MySQL 存储过程创建表

    创建 CREATE PROCEDURE  Pro_IsExistTable(ableName varchar(100),out outputParam int) BEGIN set @csql=con ...

  3. mysql 存储过程 out 用处_mysql存储过程 OUT or INOUT argument 3 for routine

    mysql存储过程出现: OUT or INOUT argument 3 for routine gotask.UserLogin is not a variable or NEW pseudo-va ...

  4. mysql存储过程注释方法_mysql存储过程 详细注释

    原文:https://my.oschina.net/u/3582142/blog/1581929 delimiter $$ /* 重新定义mysql结束符,而不再是分号是结束符 */ create p ...

  5. c# mysql存储过程 输出参数值_MySQL 存储过程参数用法 in, out, inout

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  6. mysql存储过程 简书_MySQL存储过程

    在本节中,您将逐步学习如何在MySQL中编写和开发存储过程. 首先,我们向您介绍存储过程的概念,并讨论何时使用它. 然后,展示如何使用过程代码的基本元素,如创建存储过程的语句,if-else,case ...

  7. mysql存储过程list参数_mysql存储过程教程(1)

    MySQL存储过程 1.1         CREATE  PROCEDURE  (创建) CREATE PROCEDURE存储过程名(参数列表) BEGIN SQL语句代码块 END 注意: 由括号 ...

  8. mysql的游标处理_mysql 存储过程、游标及逐行处理的配合使用

    1. 数据准备 +----+------+--------+ | id | name | price1 | +----+------+--------+ | 1 | 大米 | 5 | | 2 | 鸡蛋 ...

  9. mysql 存储过程 错误码_mysql存储过程中的错误处理_mysql

    mysql存储过程中的异常处理 http://www.cnblogs.com/cookiehu/p/4994278.html 定义异常捕获类型及处理方法: DECLAREhandler_action ...

最新文章

  1. Matlab在ubuntu上运行速度,ubuntu环境下VLFeat在MATLAB上的运行
  2. 【感悟随笔】没能变强是因为你太贪图舒服了
  3. 解Bug之路-Druid的Bug
  4. 关于回调函数的那点事
  5. Lua——基本语法知识,从hello word开始
  6. javascript的数组之reduce()
  7. 一些数学小公式/定理的证明
  8. springboot整合shiro_Springboot整合Shiro:简洁的身份认证
  9. java无ide编译_[转]无IDE时编译和运行Java
  10. 批量部署Linux操作系统的一场革命----Cobbler
  11. app提示已到期_安装软件时,显示软件证书过期,怎么回事?
  12. 【超图+CESIUM】【基础API使用示例】09、超图|CESIUM - 场景分屏设置
  13. matlab中uigetfile的使用
  14. 国外硕博论文下载网址
  15. VSCODE设置绿豆沙主题
  16. 结构力学支座位移与温度荷载、力法与矩阵位移法、图乘法核心思想
  17. Java大数据开发知识体系简介
  18. 4gl的内建函数和操作符简介
  19. Android编程权威指南第3版 源代码
  20. 手机、彩电巨头跨界互博

热门文章

  1. 【Linux】开源分布式存储系统:GlusterFS
  2. 编译 glibc-2.14 时出现的一个LD_LIBRARY_PATH不路径bug
  3. GetResponse() 基础连接已经关闭:服务器关闭了本应保持活动状态的连接
  4. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB
  5. 一步步编写操作系统(1)
  6. PHP函数篇之掌握ord()与chr()函数应用
  7. .top域名应注意什么
  8. 广域网协议:PPP协议和HDLC协议—Vecloud微云
  9. 十种机制保护三大网络基础协议(BGP、NTP和FTP)—Vecloud微云
  10. Day_04-数组,元组,列表