网站首页 > 文章中心 > 其它

mysql递归查询怎么写

作者:小编 更新时间:2023-10-21 07:51:17 浏览量:32人看过

mysql查询一个表,实现递归查询

给你个网上写的比较好的例子:

方法一:利用函数来得到所有子节点号.

创建一个function

getChildLst,

得到一个由所有子节点号组成的字符串.

mysql

mysql递归查询怎么写-图1

delimiter

//

CREATE

FUNCTION

mysql递归查询怎么写-图2

+getChildLst+(rootId

INT)

-

RETURNS

varchar(1000)

BEGIN

DECLARE

sTemp

VARCHAR(1000);

sTempChd

SET

=

'$';

=cast(rootId

as

CHAR);

WHILE

is

not

null

DO

concat(sTemp,',',sTempChd);

SELECT

group_concat(id)

INTO

FROM

treeNodes

where

FIND_IN_SET(pid,sTempChd)0;

END

WHILE;

RETURN

sTemp;

Query

OK,

rows

affected

(0.00

sec)

;

使用我们直接利用find_in_set函数配合这个getChildlst来查找

select

getChildLst(1);

+-----------------+

|

getChildLst(1)

row

in

set

*

from

FIND_IN_SET(id,

getChildLst(1));

+----+----------+------+

id

nodename

pid

A

B

C

D

E

F

G

(0.01

mysql中的递归调用

首先创建一个熟悉的机构表

插入几条测试数据:

union all上面的是初始化语句,只会执行一次,查到了 开发部 这一行记录.

此时此刻呢下面的join会用初始化的语句去原来的organization表去join获取所有 开发部的子部门 ,然后再用这些 子部门 去join更下面的部门.

执行的结果如下:

如下想查询开发部的所有上级部门的话上面的递归查询语句简单改一下就可以了:

执行结果如下:

Recursive Common Table Expression 'temp' can contain neither

aggregation nor window functions in recursive query block

mysql对递归的深度是有限制的,默认的递归深度是1000.

可以通过 show variables like 'cte_max_recursion_depth'; 进行查看

也可以通过select语句最大执行时间对递归加以显示, show variables lile 'max_execution_time';

mysql递归查询语句

mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)

由于mysql 不支持类似 oracle with ...connect的 递归查询语法

之前一直以为类似的查询要么用存储过程要么只能用程序写递归查询.

现在发现原来一条sql语句也是可以搞定的

先来看数据表的结构如下:

id name parent_id

---------------------------

①. Home 0

我要的要求是根据一个分类ID(这个分类ID可能是一个子分类),得到所有的父分类,下面是相应的SQL:

FROM (

@r AS _id,

mysql递归查询怎么写-图3

(SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,

@l := @l + 1 AS lvl

table1 h

WHERE @r 0) T1

ORDER BY T1.lvl DESC

①., 'Home'

自己仿照这看一下!

sql语句实现递归查询所有节点,mysql和oracle都能用的

首先说一下Oracle的递归查询,相信大部分人都知道很简单.无非start with connect by 函数.下面是从pId向子节点递归查询的例子,unId是数据库表中的主键.

如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换

下面再讲MySql 的递归查询方式.MySql没有Oracle的强大功能,虽然都是同一个公司的产品.所以只能靠自己写.有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种.就是新建一个function函数.

表结构不说了,无非就是 Id ,pId,其他列.下面是创建一个递归查询子节点的函数

DROP FUNCTION IF EXISTS queryChildrenPowerInfo;

SET sTemp = '$';

SET sTempChd = cast(powerId as CHAR);

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempChd);

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)0;

END WHILE;

return sTemp;

下面这句代码的意思是,查询出 t_discretionary_power? 表中,t.id 等于上面查询出的结果集的数据.FIND_IN_SET(A,B)是MYSQL的函数.意思是查找在B集合中有A的数据.相当于In

mysql怎么实现递归查询数据

mysql create table treeNodes

- (

- id int primary key,

- pid int

- );

mysql select * from treenodes;

| id | nodename | pid |

| 1 | A | 0 |

MySQL怎样做递归查询

mysql的逆袭:如何做递归层次查询

最近在做一个从oracle数据库到mysql数据库的移植,遇到一个这样的问题

在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但shi,在MySQL的目前版本中还没有对应的函数!!!

换句话来说,想要用mysql实现递归查询,根本做不到!!!

可是经过我数天茶不思饭不想的刻苦琢磨,终于想到了一个合理的,适用于mysql和其他sql的解决方案.

方案一出,就秋风扫落叶之势,席卷整个dao层~~~所到之处,所有问题迎刃而解,让所有问题都不再为问题 都成为了我这个函数的炮灰而已...

以上就是土嘎嘎小编为大家整理的mysql递归查询怎么写相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章