【MySQL数据割接案例】实现按某个字段分组,再将组内的排序序号更新为排序字段的值
事情是这样的,原本设计了一个树状结构的目录表,目录下面的节点(类似于文件)有多个类型的。由于原先只考虑一种类型A的数据,因此将目录下目录项的排序维护在了A数据表里,后面扩展加了类型B和类型C的数据,B、C也自己维护了各自的排序字段,这就导致了同一个目录下,A\B\C只能实现在自己类型中做排序和顺序调换。比如原本一个目录下的排序为 A1,A2,A3,B1,C1,C2,那么当你想对改目录下的文件进行顺序调换的时候,你只能在【A1,A2,A3】【C1,C2】中调换(B类型只有B1一个),就其原因就是排序字段的维护分散到A\B\C各自的表里了。
解决方案就是要把排序字段统一到一个表里维护,因此需要是新增一个目录项表,核心字段有:一个目录字段关联所在目录、一个类型字段区分类型、一个排序字段共同维护各个类型的排序。
表新增完要进行数据割接,一下为案例示例:
现将A\B\C跟目录挂载的数据进行迁移插入
set @num = 1000;
insert into test_sor (id ,catalog_id, type, object_id)
select (@num := @num + 1),catalog_id, 'HEALTH', healthy_id from at_healthy a where status_cd = '1000' group by catalog_id,healthy_id
insert into test_sor (id ,catalog_id, type, object_id)
select (@num := @num + 1), catalog_item_id AS catalog_id, 'LINK', link_id from at_view_link a where status_cd = '1000' group by catalog_item_id,link_id
insert into test_sor (id ,catalog_id, type, object_id)
select (@num := @num + 1), catalog_item_id AS catalog_id, 'REPORT', report_id from at_view_report a where status_cd = '1000' group by catalog_item_id,report_id
创建一个存储过程,实现每个目录下排序完,将序号更新排序字段
CREATE DEFINER=`root`@`%` PROCEDURE `update_sort`()
BEGIN
--
DECLARE s int DEFAULT 0;
DECLARE cur_catalog varchar(32) ;
DECLARE catalog CURSOR FOR SELECT DISTINCT(t.catalog_id) AS catalog_id FROM test_sor t;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
open catalog ;-- 打开游标
-- 当s不等于1,也就是未遍历完时,会一直循环
while s<>1 do
BEGIN
SET @sort = 0;
fetch catalog into cur_catalog ;
UPDATE test_sor SET sort = (@sort := @sort + 1) where catalog_id = cur_catalog;
END;
end while;
-- 关闭游标
close catalog;
end