奇淫技巧系列-SQL语句之FIELD-自定义输出顺序

定义和用法

定义

FIELD() : 函数返回值在值列表中的索引位置。
此函数执行不区分大小写的搜索。
注意:如果在值列表中没有找到指定的值,该函数将返回0。如果值为NULL,该函数将返回0。

语法

FIELD(value, val1, val2, val3, ...)

参数值

参数描述
value必需。要在列表中搜索的值
val1, val2, val3, …必需。要搜索的值列表

示例

在SQL语句中,IN函数并不保证输出结果的顺序,输出结果的顺序取决于查询的实现方式、表的索引以及数据分布等多个因素。因此,如果需要保证输出顺序,在查询语句中需要显式地使用ORDER BY子句来指定排序规则。但是如何实现单纯地改变输出结果的顺序呢? ORDER BY id ?
显然都不是能很好的达到我们需要结果自定义输出的目的

SELECT id,phone,password,nick_name,icon,create_time,update_time
FROM tb_user
WHERE id IN ( 5 ,2, 1)
ORDER BY id DESC

结果如下:
在这里插入图片描述

使用FIELD实现

SELECT id,phone,password,nick_name,icon,create_time,update_time
FROM tb_user
WHERE id IN ( 5 ,2, 1)
ORDER BY FIELD(id,2,5,1)

结果会按照我们在 FIELD 中定义的顺序来输出
在这里插入图片描述

业务具体使用

 // 实现点赞排行榜的前五名 (根据点赞顺序排序,先点赞排第一)
 public Result queryBlogLikes(Long id) {
        String key = BLOG_LIKED_KEY + id;
        // 1. 查询top5的点赞用户 zrange key 0 4
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if (top5 == null || top5.isEmpty()) {
            return Result.ok(Collections.emptyList());
        }
        // 2.解析出其中的用户id
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());
        String idStr = StrUtil.join(",", ids);
        // 3.根据用户id查询用户 WHERE id IN ( 5 , 1 ) ORDER BY FIELD(id, 5, 1)
        List<UserDTO> userDTOS = userService.query()
                .in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list()
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());
        // 4.返回
        return Result.ok(userDTOS);
    }

注意: 在mybatis-plus中 .last() 的作用是在最后一句sql语句中拼接后面的sql语句

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值