sql中上下移置顶置底置换的排序实现
sql中上下移置顶置底置换的排序实现
[toc]
一、 场景介绍
- 某个需要排序的表格,按照组别进行上下移置顶置底置换操作。其中sort越小,优先级越高。
二、 实现思路
- 上移:找到本组中本数据的上一条数据,如果没有说明已为顶部,无需上移。如果存在,二者交换sort
- 下移:找到本组中本数据的下一条数据,如果没有说明已为底部,无需下移。如果存在,二者交换sort
- 置顶:在确保非顶部时,找到该分组的最小sort,sort-1置给本数据
- 置底:在确保非底部时,找到该分组的最大sort,sort+1置给本数据
- 交换:传入两组数据交换sort即可
三、具体实现
- controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25@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);
} - serviceImpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78@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("交换成功");
} - service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/**
* @param ownerSort 自己的排序
* @param replaceGroup 自己所在分组
* @return 上一条记录,如果没有返回空
*/
PdtReplaceItem getBefore(@Param("ownerSort") Long ownerSort, @Param("replaceGroup") String replaceGroup);
/**
* @param ownerSort 自己的排序
* @param replaceGroup 自己所在分组
* @return 下一条记录,如果没有返回空
*/
PdtReplaceItem getAfter(@Param("ownerSort") Long ownerSort, @Param("replaceGroup") String replaceGroup);
/**
* @param replaceGroup 自己所在分组
* @return 该分组最小的排序
*/
Long minSort(@Param("replaceGroup") String replaceGroup);
/**
* @param replaceGroup 自己所在分组
* @return 该分组最大的排序
*/
Long maxSort(@Param("replaceGroup") String replaceGroup); - xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<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>
sql中上下移置顶置底置换的排序实现
http://example.com/20221028112918.html