mysql 分組排序賦值

2021-10-07 23:42:01 字數 3883 閱讀 1821

在實現介面平台功能時,有乙個這樣都場景:

分組下的元素可以進行拖拽移動到該分組任意位置或者其他分組任意位置

每個分組下面所有的元素都有乙個排序序號,針對元素移動時:

對原有分組下所有元素進行重新排序

對新加入對分組所有元素進行插入排序

為了更好對說明,我們建立一張這樣對錶

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語句

select

c_id,

group_id,

rank

from

(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

,@gen

from 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_id

from component,

(select

@rank:=0,

@gen:=

null

)temp

order

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大小重新進行排序

update component sc inner

join

(select

c_id,

group_id,

rank

from

(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) cin

on sc.c_id=cin.c_id set sc.c_index = cin.rank where sc.group_id =

'logic'

;

更新前的表資料為:

mysql分組排序

sql的分組排序是乙個難點,在leetcode中是乙個hard級別的題目。筆者這兩天在工作中遇到了這麼乙個需求。取過去一段時間範圍內銷量前500的商品,然後取每個商品裡面銷量最高的sku,一共500個sku。取銷量前500的商品好求,但是這500對應的最高的sku不太容易,需要用到分組排序。筆者在工...

MySQL分組排序

emp資料表建表語句 create table emp empno int,ename varchar 40 job varchar 40 mgr int,hiredate varchar 40 sal double,comm int,deptno int 插入資料準備 insert into em...

Mysql實現分組排序

資料 studenno studentname classno classname 2018140101 張三1401 14級一班 2018140111 孫一1402 14級二班 2018140121 李二1402 14級二班 2018140102 錢一1401 14級一班 2018140104 趙...