mysql递归树函数效率_MYSQL递归树查询的实现

​    在oracle中我们可以使用connect by prior 函数来实现组织树表递归的查询,但是在mysql中却没有该方法,为了能够使用该方法我们就得自己创建函数来实现该组织树的递归查询。以下实现了2种方式来满足子节点的递归查询与父节点的递归查询。

实现子递归查询

1.单个子递归查询的实现

oracle中使用示例代码:

SELECT

T.ID

FROM

bas_basic_tree T CONNECT BY PRIOR T.ID = T.PID

START WITH T.ID = #{id}

mysql中使用示例代码:

SELECT

ID

FROM

bas_basic_tree T,

(SELECT @DATAS := getChildId_bas_basic_tree (#{id})) x

WHERE find_in_set (ID, @DATAS)

mysql方法的实现:

-- 在navcat中的查询下执行以下命令

drop function if exists getChildId_bas_basic_tree;

DELIMITER //

create function getChildId_bas_basic_tree(rootId varchar(20))

returns varchar (1000)

BEGIN

DECLARE pTemp VARCHAR(1000);

DECLARE cTemp VARCHAR(1000); -- 节点ID(临时变量)

SET pTemp = '$';

SET cTemp =cast(rootId as CHAR); -- 把rootId强制转换为字符。

WHILE cTemp is not null DO

SET pTemp = concat(pTemp,',',cTemp); -- 把所有节点连接成字符串。

SELECT group_concat(id) INTO cTemp FROM bas_basic_tree

WHERE FIND_IN_SET(pid,cTemp)>0;

END WHILE;

RETURN pTemp;

END //

DELIMITER ;

2.多个子递归查询的实现

oracle中使用示例代码:

SELECT

T.ID

FROM

bas_basic_tree T CONNECT BY PRIOR T.ID = T.PID

START WITH T.ID in( #{ids} )

-- 其中ids比如是 ('1', '2') 这种

mysql中使用示例代码:

SELECT

*

FROM

bas_basic_tree T ,

(select @DATAK :=

(

SELECT

-- 使用该方法把所有的ID用逗号分割连接成一个字符串

group_concat(T.ID)

FROM

bas_basic_tree T

WHERE

NAME LIKE #{orgname}

-- 括号里面查询出来的结果类似与 '1,2' 这种

)

) z,

(SELECT @DATAS := getParentId_bas_basic_tree_more (@DATAK) ) x

WHERE find_in_set (T.ID, @DATAS)

-- 注意这里select @DATAK 与 SELECT @DATAS 顺序不能乱,否则会出现数据错误

mysql方法的实现:

drop function if exists getChildId_bas_basic_tree_more;

DELIMITER //

create function getChildId_bas_basic_tree_more(nodes varchar(1000))

returns varchar (5000)

BEGIN

DECLARE pTemp VARCHAR(1000);

DECLARE cTemp VARCHAR(5000);

SET @array_content= nodes;

SET @i=1;

SET @count=CHAR_LENGTH(@array_content) -CHAR_LENGTH(REPLACE(@array_content,',','')) + 1;

SET pTemp = '$';

WHILE @i <= @count DO

SET cTemp = SUBSTRING_INDEX(SUBSTRING_INDEX(@array_content,',',@i),',',-1);

WHILE cTemp is not null DO

SET pTemp = concat(pTemp,',',cTemp);

SELECT group_concat(id) INTO cTemp FROM bas_basic_tree

WHERE FIND_IN_SET(pid,cTemp) > 0;

END WHILE;

SET @i = @i + 1;

END WHILE;

RETURN pTemp;

END //

DELIMITER ;

实现父递归查询

1.单个父递归查询的实现

oracle中使用示例代码:

SELECT

T.ID

FROM

bas_basic_tree T CONNECT BY PRIOR T.PID = T.ID

START WITH T.ID = #{id}

mysql中使用示例代码:

SELECT

ID

FROM

bas_basic_tree T,

(SELECT @LIST := getParentId_bas_basic_tree (#{id})) x

WHERE find_in_set (ID, @LIST)

mysql方法的实现:

-- 在navcat中的查询下执行以下命令

drop function if exists getParentId_bas_basic_tree;

DELIMITER //

create function getParentId_bas_basic_tree(rootId varchar(20))

returns varchar (1000)

BEGIN

DECLARE fid varchar(100) default '';

DECLARE str varchar(1000) default rootId; -- 节点ID(临时变量)

WHILE rootId is not null do

SET fid =(SELECT pid FROM bas_basic_tree WHERE id = rootId);

IF fid is not null THEN

SET str = concat(str, ',', fid);

SET rootId = fid;

ELSE

SET rootId = fid;

END IF;

END WHILE;

return str;

END //

DELIMITER ;

2.多个父递归查询的实现

oracle中使用示例代码:

SELECT

T.ID

FROM

bas_basic_tree T CONNECT BY PRIOR T.PID = T.ID

START WITH T.ID in( #{ids} )

-- 其中ids比如是 ('1', '2') 这种

mysql中使用示例代码:

SELECT

T.*

FROM

bas_basic_tree T ,

(select @DATAK :=

(

SELECT

-- 使用该方法把所有的ID用逗号分割连接成一个字符串

group_concat(T.ID)

FROM

bas_basic_tree T

WHERE

NAME LIKE #{orgname}

-- 括号里面查询出来的结果类似与 '1,2' 这种

)

) zz,

(SELECT @DATAS := getParentId_bas_basic_tree_more (@DATAK) ) x

WHERE find_in_set (T.ID, @DATAS)

mysql方法的实现:

-- 在navcat中的查询下执行以下命令

drop function if exists getParentId_bas_basic_tree_more;

DELIMITER //

create function getParentId_bas_basic_tree_more(nodes varchar(1000))

returns varchar (5000)

BEGIN

DECLARE pTemp VARCHAR(1000);

DECLARE cTemp VARCHAR(5000);

DECLARE xTemp varchar(100);

SET @array_content= nodes;

SET @i=1;

SET @count=CHAR_LENGTH(@array_content) -CHAR_LENGTH(REPLACE(@array_content,',','')) + 1;

SET pTemp = nodes;

WHILE @i <= @count DO

SET cTemp=SUBSTRING_INDEX(SUBSTRING_INDEX(@array_content,',',@i),',',-1);

WHILE cTemp is not null DO

SET xTemp = (SELECT pid FROM bas_basic_tree WHERE id = cTemp);

IF xTemp is not null THEN

SET pTemp = concat(pTemp, ',', xTemp);

set cTemp = xTemp;

ELSE

set cTemp = xTemp;

END IF;

END WHILE;

SET @i = @i + 1;

END WHILE;

RETURN pTemp;

END //

DELIMITER ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poj 4468Spy(kmp算法)

Spy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 204 Accepted Submission(s): 96 Problem Description “Be subtle! Be subtle! And use your spies for every kind of business. ” — Sun Tzu “A spy…

mysql 64位下载 win7_关于Win7 64位 mysql 5.7下载安装问题

1、从官网下载mysql&#xff1a;网址&#xff1a;http://dev.mysql.com/downloads/mysql/这是我们要找的&#xff0c;win7 64位点击下载&#xff1b;出现如图所示&#xff0c;我们不必要登录注册&#xff0c;点击红线内的即可的即可。2、安装及配置&#xff1a;然后解压到本机文…

mysql级联保存_mysql数据库级联同步配置

mysql数据库级联同步配置步骤&#xff0c;本文以一台mysql数据库多实例3306、3307和3309为例进行配置&#xff0c;3306为主库&#xff0c;3307为从库&#xff0c;3309为子从库(多台单实例与一台多实例配置是一样的)一.my.cnf文件配置1.三个数据库实例修改my.cnf配置文件&#x…

C#实现从服务器上下载DLL文件

C#实现从服务器上下载DLL文件&#xff0c;具体代码如下&#xff1a; var fullQualifiedPathToDll Server.MapPath("/") "/bin/mydll.dll"; var myFileStream new FileStream(fullQualifiedPathToDll, FileMode.Open);var fileSize myFileStream.Length…

mysql+数据库主从原理_涨知识!MySQL 主从同步原理原来是这样的

原标题&#xff1a;涨知识&#xff01;MySQL 主从同步原理原来是这样的什么是 MySQL 主从同步当 master(主)库的数据发生变化的时候&#xff0c;变化会实时的同步到slave(从)库。主从同步有什么好处水平扩展数据库的负载能力容错&#xff0c;高可用。 Failover/High Availabili…

第三方控件netadvantage UltraWebGrid如何生成带加号多级表数据也就是带子表

1.看代码不解释&#xff1a; ds.Relations.Add("fk", ds.Tables[0].Columns["Id"], ds.Tables[1].Columns["ParentCardId"], false); 将父表和子表放到dataset中通过设置外键关联&#xff0c;这样就会自动绑定上。由于某些原因表不允许自动生成列…

mysql 中int(255)_【数据类型】int ,int(1),int(255)有什么区别?

问题&#xff1a;int(255) 数据类型的容量&#xff0c;比int(1)更多吗&#xff1f;遇到问题&#xff0c;第一反应是去查说明书&#xff0c;可以在mysql document 中找到int这种数据类型的容量是多少&#xff0c;Integer Types (Exact Value)里面只提到了 INT的容量&#xff0c;…

mysql 5.5.28 winx64_mysql-5.7.28-winx64(压缩包)安装教程

1.下载完成后解压放到指定位置我放的C:\Develop\mysql-5.7.28-winx642.在目录下新建  my.ini  内容如下[mysql]# 设置mysql客户端默认字符集default-character-setutf8[mysqld]#设置3306端口port 3306# 设置mysql的安装目录basedirC:\Develop\mysql-5.7.28-winx64# 设置my…

顶级旗舰ET9出道,蔚来还是那个「最不计成本」的中国车品牌

作者 |张祥威 编辑 |德新 2008年&#xff0c;李斌和新浪的曹国伟几人一起喝酒&#xff0c;发了第一条微博&#xff0c;「天冷带围巾&#xff0c;心冷发微博」&#xff0c;一晚上涨了2000多个粉丝&#xff0c;他偶尔还会针砭时事&#xff0c;很快积累了最早一波粉丝。 创立蔚来…

jQuery对checkbox的操作(转载)

$(document).ready(function(){//checkbox全选$(#btn1).click(function(){$("[name checkbox]").attr(checked,true);});//checkbox取消选择$(#btn2).click(function(){$("[name checkbox]").attr(checked,false);});//checkbox反选$(#btn3).click(funct…

mysql5.0 测试_mysql5.0入侵测试以及防范方法分享_MySQL

bitsCN.com在做了之前的SQL SERVER之后&#xff0c;便很想尝试一下MYSQL的入侵测试已经防范&#xff0c;与大家一起分享。总的来说&#xff0c;我一直在用的是MYSQL&#xff0c;对MYSQL比较熟悉&#xff0c;相比较而言&#xff0c;感觉MYSQL更安全&#xff0c;这只是我自己胡乱…

qt 在label上以光标位置进行缩放_Qt编写地图综合应用22-动态轨迹

一、前言上一篇文章写道拿到路径规划的轨迹点坐标集合&#xff0c;并且已经可以通过调用addPolyline绘制线段的形式将轨迹点绘制&#xff0c;接下来就是要如何动态的绘制这些轨迹点&#xff0c;最简单的方法就是开个定时器挨个取出下一个经纬度坐标&#xff0c;然后调用封装好的…

[codility]Min-abs-sum

https://codility.com/demo/take-sample-test/delta2011/ 0-1背包问题的应用。我自己一开始没想出来。“首先对数组做处理&#xff0c;负数转换成对应正数&#xff0c;零去掉&#xff0c;计数排序统计有多少个不同元素及其对应个数&#xff0c;并累加所有数的和sum&#xff0c;…

mysql kettle_带你躲过mysql与kettle闹离婚的坑,开发不迷茫

其实呢kettle配mysql还是蛮不错的&#xff0c;首先人家门当户对&#xff0c;都是开源的哈&#xff0c;其次&#xff0c;kettle也是比较听话的&#xff0c;什么事都以mysql为主&#xff0c;mysql不满意&#xff0c;他就立马报错。那下面就是mysql与kettle闹脾气要离婚的例子啦&a…

poj 1161 最短路构图

题目链接&#xff1a;http://poj.org/problem?id1161 #include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <queue> #include <vector>#define maxn 400 #define INF 0x3f…

struct里面有union_联合体union无可替代的使用

在C语言中关键字union和struct用法是一样的&#xff0c;而且在项目中struct随处可见。在我的专栏"嵌入式入门——C语言入门到深入"中我详细的讲解了它们的异同。很多人编码了多年也许会认为有struct就够了&#xff0c;要union干嘛&#xff0c;感觉union的存在有些鸡肋…

[转]字符串匹配那些事

本系列文章主要介绍几种常用的字符串比较算法&#xff0c;包括但不限于蛮力匹配算法&#xff0c;KMP算法&#xff0c;BM算法&#xff0c;Horspool算法&#xff0c;Sunday算法&#xff0c;fastsearch算法&#xff0c;KR算法等等。 本文主要介绍KMP算法和BM算法&#xff0c;它们分…

查看kafka的主从状态_Mysql 主从复制,mysql-proxy读写分离

准备两台mysql服务器&#xff0c;master&#xff08;192.168.43.64&#xff09;、slave&#xff08;192.168.84.129&#xff09;master配置&#xff1a;log-binmysql-bin binlog_formatmixed server_id1 binlog_checksumnoneslave配置:然后给master授权并查看二进制文件名称和位…

UnixLinux技术文章目录(2015-12-22更新)

Unix & Linux 方面的博客整理、归纳分类&#xff0c;要坚持不懈的学习Unix &Linux&#xff0c;加油&#xff01;技术需要累积和沉淀.更需要锲而不舍的精神、持之以恒的毅力&#xff01;借此下面名句勉励自己&#xff01; 书上有路勤为径&#xff0c;学海无涯苦作舟&…

c mysql 创建存储过程_[转]MYSQL 创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能&#xff0c;如果没有存储过程&#xff0c;在外部程序访问数据库时(例如 PHP)&#xff0c;要组织很多 SQL 语句。特别是业务逻辑复杂…