多级树形目录mysql的使用_实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)...
1,建立测试表和数据:
DROP TABLE IF EXISTS
csdn.channel;
CREATE TABLE csdn.channel (
id INT(11)
NOT NULL AUTO_INCREMENT,
cname
VARCHAR(200) DEFAULT NULL,
parent_id
INT(11) DEFAULT NULL,
PRIMARY KEY
(id)
) ENGINE=INNODB DEFAULT
CHARSET=utf8;
INSERT INTO
channel(id,cname,parent_id)
VALUES (13,'首页',-1),
(14,'TV580',-1),
(15,'生活580',-1),
(16,'左上幻灯片',13),
(17,'帮忙',14),
(18,'栏目简介',17);
DROP TABLE IF EXISTS
channel;
2,利用临时表和递归过程实现树的遍历(mysql的UDF不能递归调用):
2.1,从某节点向下遍历子节点,递归生成临时表数据--
pro_cre_childlist
DELIMITER $$
DROP PROCEDURE IF EXISTS
csdn.pro_cre_childlist$$
CREATE PROCEDURE
csdn.pro_cre_childlist(IN rootId INT,IN nDepth INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE b INT;
DECLARE cur1 CURSOR FOR
SELECT id FROM channel WHERE parent_id=rootId;
DECLARE CONTINUE HANDLER FOR
NOT FOUND SET done = 1;
SET
max_sp_recursion_depth=12;
INSERT INTO tmpLst VALUES
(NULL,rootId,nDepth);
OPEN cur1;
FETCH cur1 INTO b;
WHILE done=0 DO
CALL
pro_cre_childlist(b,nDepth+1);
FETCH cur1
INTO b;
END WHILE;
CLOSE cur1;
END$$
2.2,从某节点向上追溯根节点,递归生成临时表数据--
pro_cre_parentlist
DELIMITER
$$
DROP PROCEDURE IF EXISTS
csdn.pro_cre_parentlist$$
CREATE PROCEDURE
csdn.pro_cre_parentlist(IN rootId INT,IN nDepth INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE b INT;
DECLARE cur1 CURSOR FOR
SELECT parent_id FROM channel WHERE id=rootId;
DECLARE CONTINUE HANDLER FOR
NOT FOUND SET done = 1;
SET
max_sp_recursion_depth=12;
INSERT INTO tmpLst VALUES
(NULL,rootId,nDepth);
OPEN cur1;
FETCH cur1 INTO b;
WHILE done=0 DO
CALL
pro_cre_parentlist(b,nDepth+1);
FETCH cur1
INTO b;
END WHILE;
CLOSE cur1;
END$$
2.3,实现类似Oracle
SYS_CONNECT_BY_PATH的功能,递归过程输出某节点id路径--
pro_cre_pathlist
DELIMITER
$$
USE
csdn$$
DROP PROCEDURE IF EXISTS
pro_cre_pathlist$$
CREATE PROCEDURE
pro_cre_pathlist(IN nid INT,IN delimit VARCHAR(10),INOUT pathstr
VARCHAR(1000))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE parentid INT DEFAULT
0;
DECLARE cur1 CURSOR FOR
SELECT
t.parent_id,CONCAT(CAST(t.parent_id AS CHAR),delimit,pathstr)
FROM
channel AS t WHERE t.id = nid;
DECLARE CONTINUE HANDLER FOR
NOT FOUND SET done = 1;
SET
max_sp_recursion_depth=12;
OPEN cur1;
FETCH cur1 INTO
parentid,pathstr;
WHILE done=0 DO
CALL
pro_cre_pathlist(parentid,delimit,pathstr);
FETCH cur1
INTO parentid,pathstr;
END WHILE;
CLOSE cur1;
END$$
DELIMITER
;
2.4,递归过程输出某节点name路径--
pro_cre_pnlist
DELIMITER
$$
USE
csdn$$
DROP PROCEDURE IF EXISTS
pro_cre_pnlist$$
CREATE PROCEDURE
pro_cre_pnlist(IN nid INT,IN delimit VARCHAR(10),INOUT pathstr
VARCHAR(1000))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE parentid INT DEFAULT
0;
DECLARE cur1 CURSOR FOR
SELECT
t.parent_id,CONCAT(t.cname,delimit,pathstr)
FROM
channel AS t WHERE t.id = nid;
DECLARE CONTINUE HANDLER FOR
NOT FOUND SET done = 1;
SET
max_sp_recursion_depth=12;
OPEN cur1;
FETCH cur1 INTO
parentid,pathstr;
WHILE done=0 DO
CALL
pro_cre_pnlist(parentid,delimit,pathstr);
FETCH cur1
INTO parentid,pathstr;
END WHILE;
CLOSE cur1;
END$$
DELIMITER
;
2.5,调用函数输出id路径--
fn_tree_path
DELIMITER
$$
DROP FUNCTION IF EXISTS
csdn.fn_tree_path$$
CREATE FUNCTION
csdn.fn_tree_path(nid INT,delimit VARCHAR(10)) RETURNS
VARCHAR(2000) CHARSET utf8
BEGIN
DECLARE
pathid VARCHAR(1000);
SET
@pathid=CAST(nid AS CHAR);
CALL
pro_cre_pathlist(nid,delimit,@pathid);
RETURN
@pathid;
END$$
2.6,调用函数输出name路径--
fn_tree_pathname
-- 调用函数输出name路径
DELIMITER
$$
DROP FUNCTION IF EXISTS
csdn.fn_tree_pathname$$
CREATE FUNCTION
csdn.fn_tree_pathname(nid INT,delimit VARCHAR(10)) RETURNS
VARCHAR(2000) CHARSET utf8
BEGIN
DECLARE
pathid VARCHAR(1000);
SET
@pathid='';
CALL
pro_cre_pnlist(nid,delimit,@pathid);
RETURN
@pathid;
END$$
DELIMITER
;
2.7,调用过程输出子节点--
pro_show_childLst
DELIMITER
$$
-- 调用过程输出子节点
DROP PROCEDURE IF EXISTS
pro_show_childLst$$
CREATE PROCEDURE
pro_show_childLst(IN rootId INT)
BEGIN
DROP TEMPORARY TABLE IF
EXISTS tmpLst;
CREATE TEMPORARY TABLE IF NOT
EXISTS tmpLst
(sno INT
PRIMARY KEY AUTO_INCREMENT,id INT,depth INT);
CALL
pro_cre_childlist(rootId,0);
SELECT
channel.id,CONCAT(SPACE(tmpLst.depth*2),'--',channel.cname)
NAME,channel.parent_id,tmpLst.depth,fn_tree_path(channel.id,'/')
path,fn_tree_pathname(channel.id,'/') pathname
FROM tmpLst,channel WHERE
tmpLst.id=channel.id ORDER BY tmpLst.sno;
END$$
2.8,调用过程输出父节点--
pro_show_parentLst
DELIMITER
$$
-- 调用过程输出父节点
DROP PROCEDURE IF EXISTS
`pro_show_parentLst`$$
CREATE PROCEDURE
`pro_show_parentLst`(IN rootId INT)
BEGIN
DROP TEMPORARY TABLE IF
EXISTS tmpLst;
CREATE TEMPORARY TABLE IF NOT
EXISTS tmpLst
(sno INT
PRIMARY KEY AUTO_INCREMENT,id INT,depth INT);
CALL
pro_cre_parentlist(rootId,0);
SELECT
channel.id,CONCAT(SPACE(tmpLst.depth*2),'--',channel.cname)
NAME,channel.parent_id,tmpLst.depth,fn_tree_path(channel.id,'/')
path,fn_tree_pathname(channel.id,'/') pathname
FROM tmpLst,channel WHERE
tmpLst.id=channel.id ORDER BY tmpLst.sno;
END$$
3,开始测试:
3.1,从根节点开始显示,显示子节点集合:mysql>
CALL
pro_show_childLst(-1);
+----+-----------------------+-----------+-------+-------------+----------------------------+
| id | NAME | parent_id | depth | path
| pathname |
+----+-----------------------+-----------+-------+-------------+----------------------------+
| 13 | --首页
| -1 | 1 | -1/13 | 首页/ |
| 16 | --左上幻灯片 | 13 | 2 | -1/13/16 | 首页/左上幻灯片/ |
| 14 | --TV580 |
-1 | 1 |
-1/14 |
TV580/ |
| 17 | --帮忙 | 14 | 2 | -1/14/17 | TV580/帮忙/ |
| 18 | --栏目简介 | 17 |
3 | -1/14/17/18 |
TV580/帮忙/栏目简介/ |
| 15 | --生活580 | -1 |
1 | -1/15 | 生活580/ |
+----+-----------------------+-----------+-------+-------------+----------------------------+
6 rows in set (0.05
sec)
Query OK, 0 rows affected
(0.05 sec)
3.2,显示首页下面的子节点CALL
pro_show_childLst(13);
mysql> CALL
pro_show_childLst(13);
+----+---------------------+-----------+-------+----------+-------------------------+
| id | NAME | parent_id | depth | path | pathname |
+----+---------------------+-----------+-------+----------+-------------------------+
| 13 | --首页 |
-1 | 0 |
-1/13 | 首页/ |
| 16 | --左上幻灯片 |
13 | 1 |
-1/13/16 | 首页/左上幻灯片/ |
+----+---------------------+-----------+-------+----------+-------------------------+
2 rows in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
mysql>
3.3,显示TV580下面的所有子节点CALL
pro_show_childLst(14);
mysql> CALL
pro_show_childLst(14);
+----+--------------------+-----------+-------+-------------+----------------------------+
| id | NAME |
parent_id | depth | path | pathname |
+----+--------------------+-----------+-------+-------------+----------------------------+
| 14 | --TV580
|
-1 | 0 |
-1/14 |
TV580/ |
| 17 | --帮忙
| 14 |
1 | -1/14/17
| TV580/帮忙/ |
| 18 | --栏目简介 |
17 | 2 |
-1/14/17/18 | TV580/帮忙/栏目简介/ |
+----+--------------------+-----------+-------+-------------+----------------------------+
3 rows in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
mysql>
3.4,“帮忙”节点有一个子节点,显示出来:CALL
pro_show_childLst(17);
mysql> CALL
pro_show_childLst(17);
+----+------------------+-----------+-------+-------------+----------------------------+
| id | NAME | parent_id | depth | path
| pathname |
+----+------------------+-----------+-------+-------------+----------------------------+
| 17 | --帮忙 | 14 | 0 | -1/14/17 | TV580/帮忙/ |
| 18 | --栏目简介 | 17 |
1 | -1/14/17/18 |
TV580/帮忙/栏目简介/ |
+----+------------------+-----------+-------+-------------+----------------------------+
2 rows in set (0.03
sec)
Query OK, 0 rows affected
(0.03 sec)
mysql>
3.5,“栏目简介”没有子节点,所以只显示最终节点:mysql>
CALL pro_show_childLst(18);
+----+----------------+-----------+-------+-------------+----------------------------+
| id | NAME | parent_id | depth | path | pathname
|
+----+----------------+-----------+-------+-------------+----------------------------+
| 18 | --栏目简介
| 17 |
0 | -1/14/17/18 |
TV580/帮忙/栏目简介/ |
+----+----------------+-----------+-------+-------------+----------------------------+
1 row in set (0.36
sec)
Query OK, 0 rows affected
(0.36 sec)
mysql>
3.6,显示根节点的父节点CALL
pro_show_parentLst(-1);
mysql> CALL
pro_show_parentLst(-1);
Empty set (0.01
sec)
Query OK, 0 rows affected
(0.01 sec)
mysql>
3.7,显示“首页”的父节点CALL
pro_show_parentLst(13);
mysql> CALL
pro_show_parentLst(13);
+----+----------+-----------+-------+-------+----------+
| id | NAME | parent_id | depth | path |
pathname |
+----+----------+-----------+-------+-------+----------+
| 13 | --首页 | -1 | 0 |
-1/13 | 首页/ |
+----+----------+-----------+-------+-------+----------+
1 row in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
mysql>
3.8,显示“TV580”的父节点,parent_id为-1CALL
pro_show_parentLst(14);
mysql> CALL
pro_show_parentLst(14);
+----+---------+-----------+-------+-------+----------+
| id | NAME | parent_id | depth | path |
pathname |
+----+---------+-----------+-------+-------+----------+
| 14 | --TV580 |
-1 | 0 |
-1/14 | TV580/ |
+----+---------+-----------+-------+-------+----------+
1 row in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
3.9,显示“帮忙”节点的父节点mysql>
CALL pro_show_parentLst(17);
mysql> CALL
pro_show_parentLst(17);
+----+-----------+-----------+-------+----------+---------------+
| id | NAME | parent_id | depth | path
| pathname |
+----+-----------+-----------+-------+----------+---------------+
| 17 | --帮忙 | 14 | 0 | -1/14/17 | TV580/帮忙/ |
| 14 | --TV580 | -1 | 1 |
-1/14 | TV580/
|
+----+-----------+-----------+-------+----------+---------------+
2 rows in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
mysql>
3.10,显示最低层节点“栏目简介”的父节点CALL
pro_show_parentLst(18);
mysql> CALL
pro_show_parentLst(18);
+----+----------------+-----------+-------+-------------+----------------------------+
| id | NAME | parent_id | depth | path | pathname
|
+----+----------------+-----------+-------+-------------+----------------------------+
| 18 | --栏目简介
| 17 |
0 | -1/14/17/18 |
TV580/帮忙/栏目简介/ |
| 17 | --帮忙
|
14 | 1 |
-1/14/17 | TV580/帮忙/
|
| 14 | --TV580 |
-1 | 2 |
-1/14 |
TV580/ |
+----+----------------+-----------+-------+-------------+----------------------------+
3 rows in set (0.02
sec)
Query OK, 0 rows affected
(0.02 sec)
mysql>
多级树形目录mysql的使用_实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)...相关推荐
- asp mysql 可编辑树状,基于数据库动态生成树形目录-ASP教程,数据库相关
一. 目录树的广泛应用 为了这段内容,在百度上搜了搜,内容一大通,相关的竟没有.搜什么搜嘛?用处不是明摆着吗?资源管理器文件夹的管理,论坛中多级论坛的管理,java中的awt正是缺乏包括树形目录这样的 ...
- java bean目录_树形目录的递归实现数据库+jsp+javabean
树形目录的递归实现(一)数据库+jsp+javabean class cn {//连接数据库,这里以MS-SQL为例 String jdbcDriver="com.microsoft.jdb ...
- 印象笔记三级目录_【知识管理】如何使用印象笔记的多级目录标签做知识分类管理?...
前言 之前讲过怎么用印象笔记做知识管理,感觉讲得不够清晰,我试着重新梳理,请多多指教. 相关阅读: 原文是在公众号上排版的,复制到知乎就没那么好的阅读体验,有需要可以去微信阅读. 玩个小游戏 我们不妨 ...
- mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...
- MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量
文章目录 MySQL 变量分类 系统变量 查看系统变量 设置系统变量 如何通过配置文件来设置变量值 通过命令行选项来设置变量值 动态设置全局级的系统变量 设置静态的系统变量 设置会话级的系统变量 引用 ...
- android 树形目录结构的实现(包含源码)
1.效果如图 ,老板的需求: 1.各种群按照树形目录展开 2.点击列表可以收缩展开 3.选中后进行筛选 2.分析下思路 每个数据都应该有个根节点,也就是上级目录.确定了上级目录就可以找到当前数据对应的 ...
- mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!
MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等.而这两个方面又可以细分如下: MySQL常用语句 表 ...
- vim 树形目录插件NERDTree安装及简单用法
来源:http://blog.csdn.net/love__coder/article/details/6659103 1.安装NERDTree插件 先下载,官网:http://www.vim.org ...
- mysql职业要求_为什么面试的每一家都要求掌握MySQL?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 毕业后打算从事编程,所以自学了Java,在面试时发现很多企业都要求会MySQL.还好我有先见之明,跟学长要了一份他之前的教程资料,现在我已经顺利通过面试了 ...
最新文章
- 同步机制之 ReentrantLock
- bgl 词典_器材屋 篇五十二:“哪里不会点哪里”的后时代——哪里不识扫哪里:科大讯飞扫描词典笔评测_点读机...
- JAVA 计算String类型的时间差(秒)
- Fiori应用全屏功能的实现 - fullscreen
- SAP License:FI-SAP新总账功能(一)
- Effective Java (7) - 避免终止方法
- Go 1.5交叉编译
- python matplot绘图legend_Python matplotlib绘图基本元素
- RabbitMQ(3) Spring boot集成RabbitMQ
- 【erlang ~ 4 days】 Day # 1.1 History
- eclipse如何导入okhttp 2.x源码
- 高通平台fastboot下载
- CAN波特率计算公式
- 记一次win7 配置Windows Update 失败,还原更改,无法进入系统
- Learning through Auxiliary Tasks——辅助任务学习or自监督学习中的pretext
- Vitalik Buterin:我的 40 升背包旅行指南
- 键盘可以实现向计算机输入数据判断,计算机应用基础_学习指南.docx
- java如何设置网页全屏_java中如何进行全屏方式和窗口方式的转换 详细??
- 大学计算机D(VB.NET)
- 一个表字段做为表名_在冬天,安心做一个简单知足的人 |为你读诗