在数据库中有这样一个树形结构表记录的是中国的行政划分,字段是:地区ID,地区名,父地区ID
示例存储数据如下:
0
空
0
110000
北京市
0
110100
市辖区
110000
110101
东城区
110100
110102
西城区
110100
110103
崇文区
110100
110104
宣武区
110100
110200
县
110100
110228
密云县
110200
110229
延庆县
110200
这是一个树形的结构。如果不算id为0的节点的话,那么这将成为一个森林结构,每棵树的根节点就是中国34个省、自治区、直辖市、特别行政区中的一个
现在有另外一张表记录着每个地区的人口,那么如何计算每个省的人口呢?
肯定是将所属这个省的所有地区的人口数都加起来。
那么问题就来了,如何判断某个地区是否属于这个省呢?
其实也就是标题中的问题,如何得到树形或森林结构的根节点。
本人初学mysql,想用编写函数的方法实现,不过各种语法都不熟悉,后来百度了发现mysql里面貌似不能用递归,而且也没有找到类似的函数,所以只好尝试自己写一个了
DROP FUNCTION IF EXISTS GetRootID;
CREATE FUNCTION GetRootID (tempAreaID INT) RETURNS INT
BEGIN
DECLAREfaID 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;
所以如果百度到的实例代码语法都不统一,也不要奇怪。