mysql递归查询语句mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)
由于mysql 不支持类似 oracle with ...connect的 递归查询语法
之前一直以为类似的查询要么用存储过程要么只能用程序写递归查询.
现在发现原来一条sql语句也是可以搞定的
先来看数据表的结构如下:
idnameparent_id
---------------------------
1Home0
2About1
【mysql怎么逆递归查询 37集红楼梦】3Contact1
4Legal2
5Privacy4
6Products1
7Support1
我要的要求是根据一个分类ID(这个分类ID可能是一个子分类) , 得到所有的父分类,下面是相应的SQL:
SELECT T2.id, T2.name
FROM (
SELECT
@r AS _id,
(SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 5, @l := 0) vars,
table1 h
WHERE @r0) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC
代码@r := 5标示查询id为5的所有父类 。结果如下
1, ‘Home’
2, ‘About’
4, ‘Legal’
5, ‘Privacy’
自己仿照这看一下!
sql语句实现递归查询所有节点,mysql和oracle都能用的首先说一下Oracle的递归查询mysql怎么逆递归查询,相信大部分人都知道很简单 。无非start with connect by 函数 。下面是从pId向子节点递归查询的例子mysql怎么逆递归查询,unId是数据库表中的主键 。
如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换
下面再讲MySql 的递归查询方式 。MySql没有Oracle的强大功能,虽然都是同一个公司的产品 。所以只能靠自己写 。有很多方法,用sql去循环查询,或者写存储过程 , 我这里只提供一种 。就是新建一个function函数 。
表结构不说了,无非就是 Id , pId,其他列 。下面是创建一个递归查询子节点的函数
DROP FUNCTION IF EXISTS queryChildrenPowerInfo;
CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))
RETURNS VARCHAR(2000)
BEGIN
DECLARE sTemp VARCHAR(2000);
DECLARE sTempChd VARCHAR(2000);
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;
END
调用的时候:selectqueryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c"); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图
下面这句代码的意思是,查询出 t_discretionary_power表中,t.id 等于上面查询出的结果集的数据 。FIND_IN_SET(A,B)是MYSQL的函数 。意思是查找在B集合中有A的数据 。相当于In
select t.* from t_discretionary_powert where FIND_IN_SET(t.id,queryChildrenPowerInfo('fa2528924c7e9168014c9bedfe04039c'))
mysql中的递归调用 首先创建一个熟悉的机构表
插入几条测试数据:
union all上面的是初始化语句,只会执行一次,查到了 开发部 这一行记录 。
接下来下面的join会用初始化的语句去原来的organization表去join获取所有 开发部的子部门 , 然后再用这些 子部门 去join更下面的部门 。
执行的结果如下:
如下想查询开发部的所有上级部门的话上面的递归查询语句简单改一下就可以了:
执行结果如下:
Recursive Common Table Expression 'temp' can contain neither
aggregation nor window functions in recursive query block
mysql
mysql对递归的深度是有限制的,默认的递归深度是1000 。
- mysql游标和存储过程是什么 mysql游标表名为变量
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
