MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
来源:互联网 发布:淘宝买的旗头怎么带 编辑:程序博客网 时间:2024/04/30 11:45
首先你的项目中肯定有一张可以存储树形数据的数据表,我的项目中的这个是一个机构表,部分数据如下:
CREATE TABLE `wf_unit` (
`UNIT_ID` varchar(64) NOT NULL,
`UNIT_NAME` varchar(128) DEFAULT NULL,
`UNIT_FULLNAME` varchar(256) DEFAULT NULL,
`SUPER_UNITID1` varchar(32) DEFAULT NULL,
……
PRIMARY KEY (`UNIT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
方法一:使用函数获取
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `sysi`.`getChildIdList`(rootId VARCHAR(32) charset utf8)
RETURNS text
BEGIN
DECLARE sTemp text;
DECLARE sTempChd text;
SET@@group_concat_max_len = 102400;
SET sTemp = '$';
SET sTempChd = rootId;
WHILE sTempChd IS NOT NULL DO
SET sTemp = concat(sTemp, ',', sTempChd);
SELECT
group_concat(unit_id) INTO sTempChd
FROM
wf_unit
WHERE
FIND_IN_SET(super_unitid1, sTempChd) > 0;
END WHILE;
SET@@group_concat_max_len = 1024;
RETURN SUBSTRING(sTemp,3);
END$$
DELIMITER ;
在Mysql中的查询语句是这样的(说明:90010401是某个机构下的一个人的Unit_id,90是这个人的super_unitid1):
SELECT * from wf_unit where FIND_IN_SET('90010401',(select getChildIdList('90')))
方法二:使用存储过程和临时表
showChildList存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `sysi`.`showChildList`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `showChildList`(IN rootId VARCHAR(32) charset utf8)
BEGIN
SET@@max_sp_recursion_depth=99;
DROP TEMPORARY TABLE IF EXISTS temp_child_list;
CREATE TEMPORARY TABLE temp_child_list ( sno INT PRIMARY KEY auto_increment, _id VARCHAR (32), _depth INT );
-- 插入当前节点
INSERT INTO temp_child_list (_id, _depth) VALUES (rootId ,- 1);
-- 插入子节点
CALL createChildList (rootId, 0);
SELECT w.UNIT_ID FROM temp_child_list t, wf_unit w WHERE t._id = w.UNIT_ID ORDER BY t.sno;
END$$
DELIMITER ;
createChildList存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `sysi`.`createChildList`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `createChildList`(IN rootId VARCHAR (32), IN depth_var INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE b VARCHAR (32);
DECLARE cur1 CURSOR FOR SELECT UNIT_ID FROM wf_unit WHERE SUPER_UNITID1 = rootId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
INSERT INTO temp_child_list (_id, _depth) SELECT UNIT_ID, depth_var FROM wf_unit WHERE SUPER_UNITID1= rootId;
OPEN cur1;
FETCH cur1 INTO b;
WHILE done = 0 DO CALL createChildList (b, depth_var + 1);
FETCH cur1 INTO b;
END WHILE;
CLOSE cur1;
END$$
DELIMITER ;
在Mysql中的查询语句是这样的(说明:90是这个人的unit_id):
call showChildList('90');
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- start with connect by prior 实现递归查询(查询数据的树形结构关系)
- oracle 使用 START WITH…CONNECT BY PRIOR 实现递归查询
- Oracle start with connect by prior 用法(递归查询树形结构)
- Oracle的select语句用start with...connect by prior子句实现递归查询
- start with.....connect by prior oracle中取出树形结构
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- MYSQL实现Oracle的Start with…Connect By递归树查询
- Oracle中start with…connect by prior子句用法
- Oracle中start with…connect by prior子句用法
- Oracle中start with…connect by prior子句用法
- Oracle start with......connect by prior......子句实现递归查询
- Oracle start with.connect by prior子句实现递归查询
- Oracle start with.connect by prior子句实现递归查询
- Oracle start with.connect by prior子句实现递归查询
- tools:context=".MainActivity的作用
- LeetCode:Single Number
- 关于FCKEditor
- Android学习之 内存管理机制与应用内存优化
- 64进制
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- 关于新版Eclipse和sdk创建新增fragment.xml的解决方法
- DM8168 OSD Algorithm (DSP side)
- 电子工程领域的dB(分贝)
- 第三章 Ext框架基础及核心简介
- 在Eclipse中配置Tomcat服务器
- Tesseract OCR识别小结
- Mongodb启动命令mongod参数说明
- php 使用GD库为页面增加水印