2种MySQL实现层级关系的方法

本文介绍了在MySQL中处理层级关系的两种方法:一是创建自定义函数来处理,可能遇到不同数据库版本的兼容问题;二是通过单条SQL查询实现,详细解析了相关操作步骤和示例。
摘要由CSDN通过智能技术生成
背景:
最近在开发中,需要查询数据的组织层级关系,故写下这篇博文分享给大家一起学习,这里只做下级往上查询,上级往下级同理
  • 1 .创建一个函数
CREATE FUNCTION `getParentList` ( parentId INT ) RETURNS VARCHAR ( 1000 ) BEGIN
	DECLARE
		temp VARCHAR ( 1000 );
	DECLARE
		tempParent VARCHAR ( 1000 );
	
	SET temp = '';
	
	SET tempParent = parentId;
	#循环递归
	WHILE
			tempParent IS NOT NULL DO
		#判断是否是第一个,不加的话第一个会为空
		IF
			temp != '' THEN
				
				SET temp = concat( temp, ',', tempParent );
			ELSE 
				SET temp = tempParent;
			
		END IF;
		
		SET temp = concat( temp, ',', tempParent );
		SELECT
			group_concat( parent_id ) INTO tempParent 
		FROM
			organization 
		WHERE
			parent_id <> id 
			AND FIND_IN_SET( id, tempParent )> 0;
		
	END WHILE;
	RETURN temp;

END

在不同的数据库版本上有可能会出现如下错误:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想要在 MySQL 5.7 中更新组织机构的层级,可以尝试以下步骤: 1. 创建一个新的表来存储组织机构的层级关系,例如: ``` CREATE TABLE org_hierarchy ( org_id INT NOT NULL, parent_org_id INT, level INT, PRIMARY KEY (org_id) ); ``` 在这个表中,`org_id` 表示组织机构的唯一标识,`parent_org_id` 表示当前组织机构的父级组织机构的标识,`level` 表示组织机构在整个层级结构中的层级深度。 2. 将现有的组织机构数据插入到新表中,可以使用递归查询来实现: ``` INSERT INTO org_hierarchy (org_id, parent_org_id, level) WITH RECURSIVE cte AS ( SELECT org_id, parent_org_id, 0 AS level FROM org WHERE parent_org_id IS NULL UNION ALL SELECT o.org_id, o.parent_org_id, c.level + 1 FROM org o JOIN cte c ON o.parent_org_id = c.org_id ) SELECT org_id, parent_org_id, level FROM cte; ``` 这个查询会递归地查询每一个组织机构,并且为每个组织机构计算出它在层级结构中的深度。 3. 更新现有的组织机构表,将父级组织机构的 ID 替换为新表中的对应 ID: ``` UPDATE org JOIN org_hierarchy h ON org.org_id = h.org_id SET org.parent_org_id = h.parent_org_id; ``` 这个查询会将现有的组织机构表中的父级组织机构 ID 替换成新表中的对应 ID。 现在,你就可以通过新表 `org_hierarchy` 来查询组织机构的层级结构了。例如,如果你想要查询某个组织机构的所有下级组织机构,可以使用以下查询: ``` SELECT o.* FROM org_hierarchy h JOIN org o ON h.org_id = o.org_id WHERE h.parent_org_id = :org_id; ``` 其中,`:org_id` 是你想要查询下级组织机构的父级组织机构的 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值