【mysql】分组排序赋值
发布日期:2021-06-30 21:35:42
浏览次数:2
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月26日 13时12分41秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OSSIM(开源安全信息管理系统)在企业网络管理中的应用
2019-05-01
网站及监控利器 Pandora FMS使用体验
2019-05-01
解决Esxi5下安装Windows 8的问题
2019-05-01
如何搭建Eclipse +Apache Tomcat配置Java开发环境
2019-05-01
开源计算机集群监控Ganglia应用视频
2019-05-01
Linux软件万花筒
2019-05-01
vSphere5安装配置视频教程
2019-05-01
《Linux企业应用案例精解》一书已由清华大学出版社出版
2019-05-01
安装配置FreeBSD9全过程体验
2019-05-01
全球开源软件发展趋势分析
2019-05-01
Linux系统安全加固(一)
2019-05-01
Linux常用的安全工具
2019-05-01
Linux下网络服务的安全设置
2019-05-01
如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)
2019-05-01
从零开始安装Hadoop视频教程
2019-05-01
一款非常实用的在线代码分享站点
2019-05-01
教你一分钟制作自己的电子书(视频)
2019-05-01
用ipad维护Linux服务器
2019-05-01
如何用手机维护Mysql数据库
2019-05-01