有数据表如下:
假设有业务需求需要对查询结果进行多字段排序,比如对id和update_time需要降序排序,并且优先保证id的降序,其次再保证update_time的降序。
我们执行:
SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id, update_time desc
;
有结果如下:
可以看到id并没有降序排序,并且update_time也没有降序排序。
那是不是字段顺序问题,调转id 和 update_time的顺序查询:
SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;
可以发现结果也不对
可以发现,如果使用语句
SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;
则实际上是将查询结果按照update_time做升序,再对id做降序,并且以update_time升序为优先,也就是说desc
只对它修饰的id
字段生效,所以如果对多个字段排序,需要多次使用desc
/asc
来修饰多个字段,正确解决需求的语句如下:
SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id desc, update_time desc
;
可以看到查询结果以id
降序为有限,其次保证update_time
的降序。
有时候需要多个值在单个字段上进行模糊查询,比如对用户名user_name
字段中搜索包含张
,或李
,或赵
的用户名,mysql中有
SELECT * FROM public.table WHERE user_name REGEXP '张|李|赵';
假设张
,李
,赵
通过Listinput
,则利用mybatis-plus我们可以实现多值模糊查询sql语句:
// 多值模糊查询sql语句
List keyWords = input.getKeyWords();
String sql = "user_name REGEXP ";
if (!CollectionUtil.isEmpty(keyWords)) {
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("'");
for (String keyWord : keyWords) {
sqlBuilder.append(keyWord).append("|");
}
sqlBuilder.deleteCharAt(sqlBuilder.length() - 1).append("'");;
sql += sqlBuilder.toString();
}
// 数据库分页查询 - apply将sql语句应用
Page selectOutputPage = userInfoMapper.selectPage(
new Page<>(input.getPageNo(), input.getPageSize()),
Wrappers.lambdaQuery(User.class)
.eq(User::getIsDeleted, Boolean.FALSE)
.in(!input.getUserTypes().isEmpty(), User::getUserType, input.getUserTypes())
.apply(sql)
);