问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-21 18:21

我来回答

2个回答

懂视网 时间:2022-04-07 19:08

更多相关免费学习推荐:mysql教程(视频)

mysql查询子节点的方法:

创建menu表:

CREATE TABLE `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
 `parent_id` int(11) DEFAULT NULL COMMENT '父节点id',
 `menu_name` varchar(128) DEFAULT NULL COMMENT '菜单名称',
 `menu_url` varchar(128) DEFAULT '' COMMENT '菜单路径',
 `status` tinyint(3) DEFAULT '1' COMMENT '菜单状态 1-有效;0-无效',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO `menu` VALUES ('0', null, '菜单0', ' ', '1');
INSERT INTO `menu` VALUES ('1', '0', '菜单1', '', '1');
INSERT INTO `menu` VALUES ('11', '1', '菜单11', '', '1');
INSERT INTO `menu` VALUES ('12', '1', '菜单12', '', '1');
INSERT INTO `menu` VALUES ('13', '1', '菜单13', '', '1');
INSERT INTO `menu` VALUES ('111', '11', '菜单111', '', '1');
INSERT INTO `menu` VALUES ('121', '12', '菜单121', '', '1');
INSERT INTO `menu` VALUES ('122', '12', '菜单122', '', '1');
INSERT INTO `menu` VALUES ('1221', '122', '菜单1221', '', '1');
INSERT INTO `menu` VALUES ('1222', '122', '菜单1222', '', '1');
INSERT INTO `menu` VALUES ('12211', '1222', '菜单12211', '', '1');

得到的目录结构如下图所示:

aae031375fbee34836f6089e2449b4e.png

查询

先贴出sql语句:

select id from (
  select t1.id,
  if(find_in_set(parent_id, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
  from (
   select id,parent_id from re_menu t where t.status = 1 order by parent_id, id
   ) t1,
   (select @pids := 要查询的菜单节点 id) t2
  ) t3 where ischild != 0

比如,要查询菜单节点12的所有子节点,则查处的结果为:

0a844d9742cdf679220d22a5a1bdad4.png

热心网友 时间:2022-04-07 16:16

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,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

调用的时候:select  queryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c"); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图

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

select t.* from t_discretionary_power  t where FIND_IN_SET(t.id,queryChildrenPowerInfo('fa2528924c7e9168014c9bedfe04039c'))

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问神舟笔记本售后问题,我是在x宝上买的准系统,要是坏了是不是随便去... 写出不 不 的成语三个。(简单的)。 做淘宝天猫客服兼职,是真的吗?还要押金 淘宝刷单兼职被骗了要怎样办 神舟电脑坏了怎么办? 不( )不( )(成语) 椭圆形的脸适合这个发型吗? 天猫店铺注册兼职是真的吗?可以做吗? 广州国际会展中心参观须知 2017年10月6号到2020年5月16号,一共有多少天,多少小时,多少分钟... 数据库中nextval是什么意思 MySQL的存储过程当中,有没有类似于Oracle的表类型 想问下买OPPO Find X3还是买小米K40好? oracle数据库和mysql数据库的区别 ORACLE分析函数能在MYSQL里实现吗? 用MYSQL的存储过程 mysql中now()函数在oracle中怎么用 有没有oracle函数与mysql函数转化的工具 mysql里有没有类似oracle里的ADD_MONTHS函数,自能... 华为oppo手机哪个系列的手机,推荐一些好用性价比高? mysql nextval函数在别的库怎么取 请教一下mysql下有没有类似oracle的函数max over p... OPPOfindx3和华为mate40买那个? mysql 函数中与Oracle中ltrim函数功能相同的函数是... mysql中有和Oracle中的nvl2(expr1,expr2,expr3)效... 如何制作好吃家蛋挞液 mysql 有没有类似 oracle lag函数 OPPO Find X3值得入手吗? 怎么弄蛋挞液 MySQL实现类似Oracle序列的方案 怎样做蛋挞液简单? mysql 与oracle中的存储过程及函数有什么区别,尽... mysql和oracle的不同的方法 oracle 函数里有像mysql数据库中的SUBSTRING_INDEX... 12306待兑现显示候补人数较少是多少? 开一个奶茶店有什么风险吗,投资大概需要多少 开奶茶店有什么风险,如何分析评估 火车票候补最多能补多少人 我不想在家带娃了,打算自己做餐饮创业,加盟嗨茶... 开奶茶店的机会与威胁 火车票候补有什么规律吗? 12306候补人数较少大概有多少人 加盟与创业风险识别依据和方法是什么? 12306可以候补几个订单 重力势能的正负含义? 怎么看重力势能的正负??可以举个例子吗??(好... 为什么重力势能有正负,弹性势能只有正值,而引力... 重力势能为负,是不是方向是与正方向相反,在0以下... 怎么看重力势能的正负??可以举个 例子吗??(好... 比较重力势能大小时要带正负号么? 重力势能正负号区别和几时取正几时取负