赞
踩
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
结果如下:
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语句
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。