给你个网上写的比较好的例子:
方法一:利用函数来得到所有子节点号.
创建一个function
getChildLst,
得到一个由所有子节点号组成的字符串.
mysql
delimiter
//
CREATE
FUNCTION
+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
首先创建一个熟悉的机构表
插入几条测试数据:
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中从子类ID查询所有父类(做无限分类经常用到)
由于mysql 不支持类似 oracle with ...connect的 递归查询语法
之前一直以为类似的查询要么用存储过程要么只能用程序写递归查询.
现在发现原来一条sql语句也是可以搞定的
先来看数据表的结构如下:
id name parent_id
---------------------------
①. Home 0
我要的要求是根据一个分类ID(这个分类ID可能是一个子分类),得到所有的父分类,下面是相应的SQL:
FROM (
@r AS _id,
(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'
自己仿照这看一下!
首先说一下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 create table treeNodes
- (
- id int primary key,
- pid int
- );
mysql select * from treenodes;
| id | nodename | pid |
| 1 | A | 0 |
mysql的逆袭:如何做递归层次查询
最近在做一个从oracle数据库到mysql数据库的移植,遇到一个这样的问题
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但shi,在MySQL的目前版本中还没有对应的函数!!!
换句话来说,想要用mysql实现递归查询,根本做不到!!!
可是经过我数天茶不思饭不想的刻苦琢磨,终于想到了一个合理的,适用于mysql和其他sql的解决方案.
方案一出,就秋风扫落叶之势,席卷整个dao层~~~所到之处,所有问题迎刃而解,让所有问题都不再为问题 都成为了我这个函数的炮灰而已...
以上就是土嘎嘎小编为大家整理的mysql递归查询怎么写相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!