首页 > 数据库 >【MySQL数据割接案例】实现按某个字段分组,再将组内的排序序号更新为排序字段的值

【MySQL数据割接案例】实现按某个字段分组,再将组内的排序序号更新为排序字段的值

时间:2022-12-02 10:23:07浏览次数:50  
标签:组内 目录 割接 catalog num sor 排序 id

事情是这样的,原本设计了一个树状结构的目录表,目录下面的节点(类似于文件)有多个类型的。由于原先只考虑一种类型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

标签:组内,目录,割接,catalog,num,sor,排序,id
From: https://www.cnblogs.com/acelin/p/16943605.html

相关文章

  • 十大经典排序算法(动图演示)
      0、算法概述0.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比......
  • 指针实现字符串排序
    题目描述在主函数中输入5个字符串(每个字符串的长度不大于20),并输出这5个字符串。编写一个排序函数,完成对这些字符串按照字典顺序排序。然后在主函数中调用该排序函数,并输......
  • JAVA8-用lamda表达式和增强版Comparator进行排序
    以前的排序一般对象实现Comparable或者Comparator接口,经常是通过匿名类类实现。可以参见以前的博文Java中​​Comparable和Comparator比较​​现在看看使用lamda......
  • 冒泡排序
    冒泡排序是一种交换排序#include<iostream>usingnamespacestd;voidbubble_sort(inta[],intn){for(inti=0;i<n;i++){//外循环,趟数//内循环/......
  • 单链表的排序(python)
    思路:链表最难受的就是不能按照下标访问,只能逐个遍历,那像排序中常规的快速排序、堆排序都不能用了,只能用依次遍历的冒泡排序、选择排序这些。但是这些O(n2)O(n^2)O(n2)复杂......
  • 排序算法图文视频讲解
    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排......
  • 利用Python手把手带上实现冒泡排序
    前言之前写过一篇关于Python算法分析的文章--《​​利用Python浅尝算法分析​​》,想要学好计算机,数据结构和算法几乎是无法回避的课题,因为我们学习编程第一节课老师都会......
  • jdk8之stream原理及流创建、排序、转换等处理
    目录一、为什么需要Stream二、什么是流三、流的分类1、有多种方式生成StreamSource2、流的操作类型四、流的创建1、数组和集合创建流2、基本数值型流3、......
  • 双栈排序——二分图+模拟
    二分图建模-双栈排序题目描述Tom最近在研究一个有趣的排序问题。如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),Tom希望借助以下\(4\)种操作实现将输入序列升序排序。......
  • 力扣 leetcode 153. 寻找旋转排序数组中的最小值
    问题描述已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4......