mysql如何查询上下级机构

查询上下级机构,这个功能可能会在日常工作中遇到,如果使用的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 $$

测试结果:

(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查询机构上下级的方法。

经验分享 程序员 微信小程序 职场和发展