mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构


Posted in MySQL onApril 20, 2022

前言

查询上下级机构,这个功能可能会在日常工作中遇到,如果使用的oracle数据库,那就很简单,只需要使用oracle提供的层级查询即可实现。如果使用的mysql数据库,那么就需要自己实现这个功能。下面就介绍mysql实现上下级机构查询。

思路:

  • 自定义mysql方法
  • 利用mysql中的【FIND_IN_SET】【group_concat】两个方法

(1)准备测试数据表

CREATE TABLE `org_test` (
  `org_no` varchar(32) NOT NULL COMMENT '机构编号',
  `org_name` varchar(200) NOT NULL COMMENT '机构名称',
  `p_org_no` varchar(32) DEFAULT NULL COMMENT '上级机构编号',
  PRIMARY KEY (`org_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

测试数据

INSERT INTO `org_test` VALUES ('1001', '福建省', null);
INSERT INTO `org_test` VALUES ('100101', '厦门市', '1001');
INSERT INTO `org_test` VALUES ('10010101', '思明区', '100101');
INSERT INTO `org_test` VALUES ('10010102', '湖里区', '100101');
INSERT INTO `org_test` VALUES ('10010103', '同安区', '100101');
INSERT INTO `org_test` VALUES ('100102', '福州市', '1001');

(2)查询指定机构的所有下级机构(包括自身)

delimiter $$
CREATE FUNCTION getOrgChild (orgNo varchar(32)) RETURNS varchar(1000) CHARSET utf8
BEGIN
	-- 定义临时变量
	DECLARE tmpOrg varchar(1000) DEFAULT '';
	-- 循环查询,orgNo不为空,则循环
	WHILE orgNo IS NOT NULL DO
		-- 拼接所有查询结果
		IF tmpOrg = '' THEN
			SET tmpOrg = CONCAT(tmpOrg, orgNo);
		ELSE
			SET tmpOrg = CONCAT(tmpOrg, ',', orgNo);
		END IF;
		-- 查询数据
		SELECT group_concat(org_no) INTO orgNo FROM org_test WHERE FIND_IN_SET(p_org_no, orgNo) > 0;
	END WHILE;
	
	-- 返回结果
	RETURN tmpOrg;
END $$

测试结果:

mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构

(3)查询指定机构的所有上级机构(包括自身)

delimiter $$
CREATE FUNCTION getOrgParent (orgNo varchar(32)) RETURNS varchar(1000) CHARSET utf8
BEGIN
	-- 定义临时变量
	DECLARE tmpOrg varchar(1000) DEFAULT '';
	-- 循环查询,orgNo不为空,则循环
	WHILE orgNo IS NOT NULL DO
		-- 拼接所有查询结果
		IF tmpOrg = '' THEN
			SET tmpOrg = CONCAT(tmpOrg, orgNo);
		ELSE
			SET tmpOrg = CONCAT(tmpOrg, ',', orgNo);
		END IF;
		-- 查询数据
		SELECT group_concat(p_org_no) INTO orgNo FROM org_test WHERE FIND_IN_SET(org_no, orgNo) > 0;
	END WHILE;
	
	-- 返回结果
	RETURN tmpOrg;
END $$

测试结果:

mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构

总结

到此这篇关于mysql查询上下级机构的文章就介绍到这了!

MySQL 相关文章推荐
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
在MySQL中你成功的避开了所有索引
Apr 20 #MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 #MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
MySQL去除密码登录告警的方法
Apr 20 #MySQL
MySQL数据库事务的四大特性
Windows 64位 安装 mysql 8.0.28 图文教程
分析MySQL优化 index merge 后引起的死锁
You might like
通过Email发送PHP错误的方法
2015/07/20 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
js点击事件链接的问题解决
2014/04/25 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
vue--vuex详解
2019/04/15 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
python发布模块的步骤分享
2014/02/21 Python
Python的gevent框架的入门教程
2015/04/29 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
python根据url地址下载小文件的实例
2018/12/18 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
通过Python实现一个简单的html页面
2020/05/16 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
美国轮胎网站:Priority Tire
2018/11/28 全球购物
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
成教自我鉴定
2013/10/27 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
机电一体化专业求职信
2014/07/22 职场文书
一年级语文教学随笔
2015/08/14 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
《花钟》教学反思
2016/02/17 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS