【mysql】分组排序赋值
发布日期:2021-06-30 21:35:42 浏览次数:3 分类:技术文章

本文共 2536 字,大约阅读时间需要 8 分钟。

在实现接口平台功能时,有一个这样都场景:

分组下的元素可以进行拖拽移动到该分组任意位置或者其他分组任意位置

需求

每个分组下面所有的元素都有一个排序序号,针对元素移动时:

  1. 对原有分组下所有元素进行重新排序
  2. 对新加入对分组所有元素进行插入排序

数据表结构

为了更好对说明,我们创建一张这样对表

CREATE TABLE component (c_id varchar(100), group_id varchar(20),  c_index int);INSERT INTO component VALUES ('60ff7822-f069-4b86-965a-e203c1d08bc2', 'controller', 0);INSERT INTO component VALUES ('57492441-c593-4fa1-a6d4-3ae7741174c5', 'controller', 1);INSERT INTO component VALUES ('87e35747-b1a9-49c5-8c10-8d87d7208eb4', 'controller', 3);INSERT INTO component VALUES ('ee0d4f29-8a62-44fc-a955-6457c4cdfc53', 'logic', 1);INSERT INTO component VALUES ('fe84866b-6379-4d1e-9a40-37576a3c1f0d', 'logic', 2);INSERT INTO component VALUES ('d32bd2d6-469b-483a-bd76-5a1bc1b04351', 'logic', 3);INSERT INTO component VALUES ('22127158-9691-4a28-9dd6-a0786c700192', 'logic', 5);INSERT INTO component VALUES ('f569c762-bdde-49f8-83d9-9bebc58a5db4', 'timer', 2);

实现sql

现在需要得到一个新的排序的表,我们先看看具体实现的sql语句

select    c_id,    group_id,    rankfrom    (select        c_id,        group_id,        c_index,        @rank:=if(@gen=group_id,@rank+1,1) rank,        @gen:=group_id    from component,(select @rank:=0,@gen:=null) temp    order by group_id, c_index asc) b;

执行结果:

在这里插入图片描述
解析一下这段sql语句的执行

实现逻辑

1. 赋值变量

select    c_id,    group_id,    c_index,    @rank,    @genfrom component,(select @rank:=0,@gen:=null) temp;

执行结果:

在这里插入图片描述

2. 使用IF条件进行分组

不要太关注from component,(select @rank:=0,@gen:=null) temp,就是当作进行变量的初始化就好

select  c_id,    group_id,    c_index,    @rank:=if(@gen=group_id,@rank+1,0) rank,    @gen:=group_idfrom component,(select @rank:=0,@gen:=null) temporder by group_id, c_index asc

sql执行的流程说明

a.第一步:变量赋值,是先运行from 后面的内容,以及排序,排序的目的是把controller、logic、timer放到各自的组中(这一点和我们原来的先select 后order 是不一样的,等下会有说明)此时@rank等于0,@gen等于null
b.第二步: 开始进行select中的内容,会先进行
第一行,运行
@rank:=if(@gen=group_id,@rank+1,0) rank,此时@gen是等于null的,而group_id 是第一行的值,所以IF函数将会返回0,第一行的rank就会返回0,接着运行@gen:=group_id ,此时的@gen会被赋值第一行的值
第二行,
还是先运行@rank:=if(@gen=group_id,@rank+1,0) rank,此时的@gen是等于group_id,根据IF会返回@rank+1 然后赋值到@rank,直到遇到下一个不一样的group_id,@rank 才会重新变成0

mysql 的变量赋值有 = 和 :=,这两种形式,但是在select 后面的赋值,要用:=这种形式,如果不用就会出现这样的问题

index排序更新

接下来还有一个就是更新原有的index,根据index大小重新进行排序

update component sc inner join (select    c_id,    group_id,    rankfrom    (select        c_id,        group_id,        c_index,        @rank:=if(@gen=group_id,@rank+1,0) rank,        @gen:=group_id    from component,(select @rank:=0,@gen:=null) temp    order by group_id, c_index asc) b) cinon sc.c_id=cin.c_id set sc.c_index = cin.rank where sc.group_id = 'logic';

更新前的表数据为:

在这里插入图片描述更新后的表数据为:
在这里插入图片描述

转载地址:https://lluozh.blog.csdn.net/article/details/107264837 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【jmeter】Arrivals Thread Group
下一篇:【SpringBoot】数据库多数据源

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月28日 09时46分34秒