MySQL问题篇2:关于IN字段不按照顺序返回问题

一、发现问题

数据库表结构如下:

其查询语句如下:

SELECT
	*
FROM
	department
WHERE
	department_id IN (5,4,2,3,1)

其返回结果如下: 

 

到此处我们发现了问题,其中我in写的是(5,4,2,3,1),其返回结果顺序为1,2,3,4,5,如果我们就是想按照我们in的顺序来返回数据的顺序,其显然的不对的。 

二、解决方案 

无论因为何种问题,导致我们无法按照有规则的字段进行排序返回结果,只能通过in中顺序来返回的结果,我们只能使用自定义排序

MySQL中ORDER BY的field()函数,可以用来对SQL中查询结果集进行指定顺序排序。

其一般语法为:field(字段,value,value,.......)

来看上面的解决方案:

SELECT
	*
FROM
	department
WHERE
	department_id IN (5, 4, 2, 3, 1)
ORDER BY
	FIELD(department_id, 5, 4, 2, 3, 1)

其结果集:
 

到这里基本的理论就完事了,但是实际开发中我们使用的是springboot,其使用的是mybatis与mybatisplus,而且也不可能正好的就是写死id的值,那我们怎么办呢? 

三、在 mybatis中的应用

其在mapper中可以有类似的处理,使用foreach进行循环,原理懂即可

 <select id="selectDepartmentsInOrder" resultType="com.example.Department">
        SELECT department_id, name
        FROM department
        WHERE department_id IN
        <foreach item="id" collection="list" open="(" separator="," close=")">
            #{id}
        </foreach>
        ORDER BY FIELD(department_id,
        <foreach item="id" collection="list" separator=",">
            #{id}
        </foreach>
        )
    </select>

如果是在mybatisplus中就要复杂一点了 

 List<Integer> departmentIds = Arrays.asList(5, 4, 2, 1, 3);
//按照5,4,1,2,3
 String idStr = StrUtil.join(",", departmentIds );
    List<DepartmentDTO> departmentDTOS = departmentService.query()
            .in("id",ids)
            .last("order by field(id,"+idStr+")").list()

首先我们要干的事情是拼接list列表中的id,然后在mbp中没有关于field函数,所以我们只能用last来手动写查询语句,然后拼接 。

相关推荐

  1. 关于mysql字段类型为text还提示类型太短问题

    2024-06-17 07:00:03       41 阅读
  2. 关于mysql mac 输入mysql -uroot -p 能访问的问题

    2024-06-17 07:00:03       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 07:00:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 07:00:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 07:00:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 07:00:03       20 阅读

热门阅读

  1. QSharedMemory使用详解

    2024-06-17 07:00:03       7 阅读
  2. Qt 实战(4)信号与槽 | 4.3、信号连接信号

    2024-06-17 07:00:03       6 阅读
  3. 跨域资源共享(CORS)问题与解决方案

    2024-06-17 07:00:03       7 阅读
  4. wxml与标准的html的异同?

    2024-06-17 07:00:03       6 阅读
  5. 3.1. 马氏链-马氏链的定义和示例

    2024-06-17 07:00:03       6 阅读
  6. Android基础-JNI

    2024-06-17 07:00:03       6 阅读
  7. 一个简单的UDP客户端和服务端的完整C++示例

    2024-06-17 07:00:03       7 阅读
  8. 学习vite的核心原理

    2024-06-17 07:00:03       6 阅读
  9. Flutter学习(一)

    2024-06-17 07:00:03       7 阅读
  10. 【websocket】怎么终止websocket断开重连

    2024-06-17 07:00:03       9 阅读
  11. 【Git】撤销远程仓库的提交(push)

    2024-06-17 07:00:03       9 阅读
  12. cbam+lstm代码预测

    2024-06-17 07:00:03       5 阅读
  13. vant的作用及其使用方法

    2024-06-17 07:00:03       7 阅读
  14. 大数据开发语言Scala入门

    2024-06-17 07:00:03       8 阅读