Mysql中编写函数得到树形或森林结构中某节点的根

在数据库中有这样一个树形结构表记录的是中国的行政划分,字段是:地区ID,地区名,父地区ID

示例存储数据如下:

00
110000北京市0
110100 市辖区110000
110101东城区110100
110102西城区110100
110103崇文区110100
110104宣武区110100
110200110100
110228密云县110200
110229延庆县110200

这是一个树形的结构。如果不算id为0的节点的话,那么这将成为一个森林结构,每棵树的根节点就是中国34个省、自治区、直辖市、特别行政区中的一个


现在有另外一张表记录着每个地区的人口,那么如何计算每个省的人口呢?

肯定是将所属这个省的所有地区的人口数都加起来。

那么问题就来了,如何判断某个地区是否属于这个省呢?

其实也就是标题中的问题,如何得到树形或森林结构的根节点。


本人初学mysql,想用编写函数的方法实现,不过各种语法都不熟悉,后来百度了发现mysql里面貌似不能用递归,而且也没有找到类似的函数,所以只好尝试自己写一个了


DROP FUNCTION IF EXISTS GetRootID; 
CREATE FUNCTION GetRootID (tempAreaID INT) RETURNS INT
BEGIN
DECLARE	faID INT DEFAULT -1; 
DECLARE ID INT DEFAULT -1;
		SET ID = tempAreaID;
		WHILE (faID != 0) DO
			SELECT FatherAreaID INTO faID FROM db_AreaDivision WHERE AreaID = ID  limit 1 /*得到父结点*/;
			IF (faID != 0) THEN
				SET ID = faID;
			ELSE
				RETURN ID;
			END IF;
		END WHILE;
END
以上代码在navicat中编写,mysql的版本是5.7.3


需要注意的是函数的参数名不要和数据库中的表字段相同,要不然这个函数死活也算不出正确结果()

使用SELECT FatherAreaID INTO faID是将查询到的结果赋值给faID,但是由于faID是整形变量,查询的结果是表结构,所以需要保证查询结果只有一行一列,可以加上limit 1 加以限制(如果返回多行的话说明数据错了)


mysql中的语法格式比较多样,例如赋值语句SET ID = tempAreaID;可以写成SET ID := tempAreaID;或者SET @ID = tempAreaID;

所以如果百度到的实例代码语法都不统一,也不要奇怪。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值