【mysql】分组排序赋值
发布日期:2021-06-30 21:35:42
浏览次数:3
分类:技术文章
本文共 2536 字,大约阅读时间需要 8 分钟。
在实现接口平台功能时,有一个这样都场景:
分组下的元素可以进行拖拽移动到该分组任意位置或者其他分组任意位置需求
每个分组下面所有的元素都有一个排序序号,针对元素移动时:
- 对原有分组下所有元素进行重新排序
- 对新加入对分组所有元素进行插入排序
数据表结构
为了更好对说明,我们创建一张这样对表
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 才会重新变成0mysql 的变量赋值有 = 和 :=,这两种形式,但是在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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月28日 09时46分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
nominal和ordinal & 数据处理中四种基本数据类型
2019-04-30
Grid SearchCV(网格搜索)& Python实现
2019-04-30
Trie树(字典树)
2019-04-30
COMP7404 Machine Learing——ROC
2019-04-30
MATLAB与CUDA
2019-04-30
Linux png转jpg (convert命令)
2019-04-30
Ubuntu更新后终端中字体的颜色全是白色
2019-04-30
vscode git
2019-04-30
基于MATLAB的二进制数字调制与解调信号的仿真——2PSK
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——DSB
2019-04-30
HDU - 1166 敌兵布阵 (树状数组模板题/线段树模板题)
2019-04-30
CodeForces - 761C Dasha and Password (思维 暴力)
2019-04-30
牛客国庆集训派对Day4——I 连通块计数(思维)
2019-04-30
CodeForces - 629B Far Relative’s Problem(模拟)
2019-04-30
CodeForces - 456C Boredom (dp)
2019-04-30