由于项目要分地区,而且是自己定义的 ,所有创建一个分组表
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不能被迁移的 猜想是框架没有做这个处理, 记录工作中遇到的问题,方便自己查找。