sql递归查找父节点的例子

由于项目要分地区,而且是自己定义的 ,所有创建一个分组表

CREATE TABLE `group_info` (
  `group_id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '分组ID',
  `content` varchar(2000) DEFAULT NULL COMMENT '分组说明',
  `f_group_id` bigint(10) DEFAULT NULL COMMENT '上级分组ID',
  `group_name` varchar(255) DEFAULT NULL COMMENT ' 分组名称',
  `field_id` bigint(10) NOT NULL COMMENT '域的id',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_mod` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

这个就是设计的表结构可以根据上级找下级,刚开始有一个分组全名称 group_full_name 比如这种“重庆市_九龙坡区”的显示字段,后来觉得它没有必要存在,而且用代码递归,很难维护,更改了上级,下级也要跟着变,觉得太繁琐了。

所有觉定写一个 sql函数:


DROP FUNCTION IF EXISTS getParentList;
CREATE FUNCTION getParentList (rootId varchar(1000))
RETURNS varchar(1000)
BEGIN
DECLARE fid varchar(1000) default '';
DECLARE str varchar(1000) default rootId;
DECLARE groupName varchar(1000) default '';
DECLARE fullName varchar(1000) default '';
WHILE rootId is not null  do
    SET fid =(SELECT f_group_id FROM group_info WHERE group_id = rootId);
    SET groupName=(SELECT group_name FROM group_info WHERE group_id = rootId);
    IF fid is not null THEN
SET fullName = concat(groupName, '_', fullName);
        SET rootId = fid;
    ELSE
        SET rootId = fid;
    END IF;
END WHILE;
SET fullName= TRIM('_' FROM fullName);
return fullName;
END;

 这样只需要传一个下级的groupId也就是rootId就可以把group_full_name完全展示出来,这个用起来很方便,

SELECT
g.group_id,
g.content,
g.group_name,
g.f_group_id,
g.gmt_create,
     getParentList(g.group_id) AS group_full_name
FROM
group_info g

这样分组全名称就直接展示出来了,如果有人用到了flyway来做数据库迁移,function不能被迁移的 猜想是框架没有做这个处理,  记录工作中遇到的问题,方便自己查找。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值