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复制问题的三个参数分析
Apr 07 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
深入解析MySQL索引数据结构
Oct 16 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php 小乘法表实现代码
2009/07/16 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JS input 数字验证代码
2009/07/30 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
JavaScript函数详解
2014/11/17 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python批量生成本地ip地址的方法
2015/03/23 Python
python re模块的高级用法详解
2018/06/06 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python创建或生成列表的操作方法
2019/06/19 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Python代码注释规范代码实例解析
2020/08/14 Python
python实现磁盘日志清理的示例
2020/11/05 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
商业房地产广告语
2014/03/13 职场文书
一年级评语大全
2014/04/23 职场文书
市场开发计划书
2014/05/07 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
病人慰问信范文
2015/02/15 职场文书
刑事起诉书范文
2015/05/19 职场文书
民事答辩状格式范文
2015/05/21 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技