sql中上下移置顶置底置换的排序实现
原文链接:小回博客
一、 场景介绍
某个需要排序的表格,按照组别进行上下移置顶置底置换操作。其中sort越小,优先级越高。
二、 实现思路
上移:找到本组中本数据的上一条数据,如果没有说明已为顶部,无需上移。如果存在,二者交换sort 下移:找到本组中本数据的下一条数据,如果没有说明已为底部,无需下移。如果存在,二者交换sort 置顶:在确保非顶部时,找到该分组的最小sort,sort-1置给本数据 置底:在确保非底部时,找到该分组的最大sort,sort+1置给本数据 交换:传入两组数据交换sort即可
三、具体实现
@ApiOperation ( value = "上移 " )
@PostMapping ( "/upper" )
public Result increase ( @RequestBody Map < String , Object > map) {
return pdtReplaceItemService. presentToBefore ( map) ;
}
@ApiOperation ( value = "下移 " )
@PostMapping ( "/lower" )
public Result lower ( @RequestBody Map < String , Object > map) {
return pdtReplaceItemService. presentToAfter ( map) ;
}
@ApiOperation ( value = "置顶 " )
@PostMapping ( "/top" )
public Result head ( @RequestBody Map < String , Object > map) {
return pdtReplaceItemService. head ( map) ;
}
@ApiOperation ( value = "置底 " )
@PostMapping ( "/bottom" )
public Result tail ( @RequestBody Map < String , Object > map) {
return pdtReplaceItemService. tail ( map) ;
}
@ApiOperation ( value = "互换 " )
@PostMapping ( "/exchange" )
public Result exchange ( @RequestBody Map < String , Object > map) {
return pdtReplaceItemService. exchange ( map) ;
}
@Override
public Result presentToBefore ( Map < String , Object > map) {
Long id = MapUtil . getLong ( map, "id" ) ;
PdtReplaceItem replaceItem = pdtReplaceItemMapper. selectById ( id) ;
String replaceGroup = replaceItem. getReplaceGroup ( ) ;
Long ownerSort = replaceItem. getSort ( ) ;
PdtReplaceItem beforeReplaceItem = pdtReplaceItemMapper. getBefore ( ownerSort, replaceGroup) ;
if ( beforeReplaceItem == null ) {
return Result . failed ( "已为顶部,无需上移" ) ;
}
Long beforeSort = beforeReplaceItem. getSort ( ) ;
replaceItem. setSort ( beforeSort) ;
beforeReplaceItem. setSort ( ownerSort) ;
pdtReplaceItemMapper. updateById ( replaceItem) ;
pdtReplaceItemMapper. updateById ( beforeReplaceItem) ;
return Result . succeed ( "上移成功" ) ;
}
@Override
public Result presentToAfter ( Map < String , Object > map) {
Long id = MapUtil . getLong ( map, "id" ) ;
PdtReplaceItem replaceItem = pdtReplaceItemMapper. selectById ( id) ;
String replaceGroup = replaceItem. getReplaceGroup ( ) ;
Long ownerSort = replaceItem. getSort ( ) ;
PdtReplaceItem afterReplaceItem = pdtReplaceItemMapper. getAfter ( ownerSort, replaceGroup) ;
if ( afterReplaceItem == null ) {
return Result . failed ( "已为底部,无需下移" ) ;
}
Long afterSort = afterReplaceItem. getSort ( ) ;
replaceItem. setSort ( afterSort) ;
afterReplaceItem. setSort ( ownerSort) ;
pdtReplaceItemMapper. updateById ( replaceItem) ;
pdtReplaceItemMapper. updateById ( afterReplaceItem) ;
return Result . succeed ( "下移成功" ) ;
}
@Override
public Result head ( Map < String , Object > map) {
Long id = MapUtil . getLong ( map, "id" ) ;
PdtReplaceItem replaceItem = pdtReplaceItemMapper. selectById ( id) ;
String replaceGroup = replaceItem. getReplaceGroup ( ) ;
Long ownerSort = replaceItem. getSort ( ) ;
PdtReplaceItem beforeReplaceItem = pdtReplaceItemMapper. getBefore ( ownerSort, replaceGroup) ;
if ( beforeReplaceItem == null ) {
return Result . failed ( "已为顶部,无需上移" ) ;
}
Long minSort = pdtReplaceItemMapper. minSort ( replaceGroup) ;
replaceItem. setSort ( minSort - 1 ) ;
pdtReplaceItemMapper. updateById ( replaceItem) ;
return Result . succeed ( "置顶成功" ) ;
}
@Override
public Result tail ( Map < String , Object > map) {
Long id = MapUtil . getLong ( map, "id" ) ;
PdtReplaceItem replaceItem = pdtReplaceItemMapper. selectById ( id) ;
String replaceGroup = replaceItem. getReplaceGroup ( ) ;
Long ownerSort = replaceItem. getSort ( ) ;
PdtReplaceItem afterReplaceItem = pdtReplaceItemMapper. getAfter ( ownerSort, replaceGroup) ;
if ( afterReplaceItem == null ) {
return Result . failed ( "已为底部,无需下移" ) ;
}
Long maxSort = pdtReplaceItemMapper. maxSort ( replaceGroup) ;
replaceItem. setSort ( maxSort + 1 ) ;
pdtReplaceItemMapper. updateById ( replaceItem) ;
return Result . succeed ( "置底成功" ) ;
}
@Override
public Result exchange ( Map < String , Object > map) {
Long ownerId = MapUtil . getLong ( map, "ownerId" ) ;
Long otherId = MapUtil . getLong ( map, "otherId" ) ;
PdtReplaceItem owner = pdtReplaceItemMapper. selectById ( ownerId) ;
PdtReplaceItem other = pdtReplaceItemMapper. selectById ( otherId) ;
long ownerSort = owner. getSort ( ) ;
long otherSort = other. getSort ( ) ;
owner. setSort ( otherSort) ;
other. setSort ( ownerSort) ;
pdtReplaceItemMapper. updateById ( owner) ;
pdtReplaceItemMapper. updateById ( other) ;
return Result . succeed ( "交换成功" ) ;
}
PdtReplaceItem getBefore ( @Param ( "ownerSort" ) Long ownerSort, @Param ( "replaceGroup" ) String replaceGroup) ;
PdtReplaceItem getAfter ( @Param ( "ownerSort" ) Long ownerSort, @Param ( "replaceGroup" ) String replaceGroup) ;
Long minSort ( @Param ( "replaceGroup" ) String replaceGroup) ;
Long maxSort ( @Param ( "replaceGroup" ) String replaceGroup) ;
< select id = " getBefore" resultType = " com.yk.i_wms.model.PdtReplaceItem" >
SELECT
*
FROM
pdt_replace_item
WHERE
replace_group=#{replaceGroup}
AND #{ownerSort} > sort
ORDER BY sort DESC,id DESC
LIMIT 0,1;
</ select>
< select id = " getAfter" resultType = " com.yk.i_wms.model.PdtReplaceItem" >
SELECT
*
FROM
pdt_replace_item
WHERE
replace_group=#{replaceGroup}
AND sort > #{ownerSort}
ORDER BY sort ASC,id ASC
LIMIT 0,1;
</ select>
< select id = " minSort" resultType = " java.lang.Long" >
select MIN(sort) from pdt_replace_item where replace_group=#{replaceGroup}
</ select>
< select id = " maxSort" resultType = " java.lang.Long" >
select MAX(sort) from pdt_replace_item where replace_group=#{replaceGroup}
</ select>