- 借鉴微信的置顶与取消置顶的实现思路:
会看到这个微信的聊天记录的排序规则是以时间降序来进行排序的,如果要实现置顶与取消置顶? 一下子是想不到的,需要思路
由此可以确信的是,我们平时使用微信时,最新的聊天记录总是在前面的,多久不聊的聊天是在最后面的。
在项目中需要实现置顶与取消置顶的功能,刚开始没有思路,苦思冥想了半天,以前也没有做过类似的需求。
于是我一直在使用微信的置顶与取消置顶的功能,玩着玩着还挺好玩,我只要最后点击某条聊天记录置顶,那么这条记录就一定会在第一条显示,并且在它前面置顶的聊天记录会依次在它的下面显示。如果我取消了某条 (置顶过) 的聊天记录,那么它的位置就是在它(聊天记录)的 创建的时间点上。当时就特别好奇,这到底要怎么实现?
一直写SQL语句反复尝试还没有思路,整个人都快傻了,这应该是个很简单的功能,为什么就是写不出来,又想不对啊,怎么可能在一个字段中就 实现置顶与取消置顶,并且还要排序? 终于,我在测试表中仅有的字段又加了一个标记字段 is_top(是否置顶), 神奇的现象发生了, 我想要的结果出来了 ,哈哈哈
(这是类似于微信的,先以是否置顶降序排,再以排序字段降序排(盲猜我这个对应微信的聊天记录的创建时间,哈哈哈))
SELECT * FROM tb_test ORDER BY is_top DESC,sort_num DESC
(这是我,应该更容易理解,嗯)
SELECT * FROM `tb_test` ORDER BY is_top DESC,sort_num ASC
从结果可以看出来,这句SQL语句再执行的时候,先排第一个字段,再排第二个字段,所有从这个思路,思路逐渐清晰:
当前文稿置顶:
@Override
public Map<Integer, String> stick(Long publishId) {
// 1: 获取 is_top字段 的最大值
Integer isTopMax = publishInfoMapper.getIsTopMax();
// 2: 查询当前文稿
PublishInfo publishInfoUpdate = new PublishInfo();
publishInfoUpdate.setPublishId(publishId);
// 创建查询对象
QueryWrapper<PublishInfo> queryWrapper = Wrappers.query(publishInfoUpdate);
PublishInfo publishInfo = null;
try {
publishInfo = publishInfoMapper.selectOne(queryWrapper);
} catch (Exception e) {
throw new RuntimeException(e);
}
Map<Integer, String> resultMap = new HashMap<>();
if (ObjectUtils.isEmpty(publishInfo)) {
throw new OperationException(OperationExEnum.ABSENT, "无法找到对应id的文稿,无法进行置顶显示,请确认id是否正确 !");
} else {
Integer isTop = publishInfo.getIsTop();
if (isTop.equals(isTopMax)) {
resultMap.put(OperationExEnum.MODIFICATION_FAILURE.getStatusCode(), "当前文稿已经置顶,请重新选择 !");
} else if (isTop < 0)<