原创

mysql使用IN关键字查询时 返回结果的顺序问题

近日 做一个接口需要按照传入的ids[]的顺序返回数据,但是使用in关键字查询后返回的结果均为id递增顺序排序(我默认莫勇order by),如下

<select id="selectByIds" resultMap="rm">
        SELECT
        t.id,
        t.category_id,
        t.title,
        t.pic,
        t.status,
        t.sort,
        t.create_time,
        t.update_time
        FROM
        xxx t
        WHERE id IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>

查阅后发现:

MySQL 默认排序行为

在某些情况下,数据库(如 MySQL)在处理 IN 查询时,可能会自动根据 id 字段的索引进行排序。MySQL 在执行 IN 查询时,默认不会强制保证顺序,但它可能会根据查询计划(执行计划)和索引优化来返回结果,导致返回结果按照 id 排序。尤其是在 id 是主键或有索引时,数据库可能会选择按照 id 的顺序进行返回。

所以会出现我遇到的问题。

解决方法是在sql中显式的使用FIELD()函数定义order by规则,如下

<select id="selectByIds" resultType="rm">
  SELECT
    t.id,
    t.category_id,
    t.title,
    t.pic,
    t.status,
    t.sort,
    t.create_time,
    t.update_time
  FROM
    xxx t
  WHERE
    t.id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
      #{id}
    </foreach>
  ORDER BY
    FIELD(t.id,
      <foreach collection="ids" item="id" separator=",">
        #{id}
      </foreach>
    )
</select>

field函数用法:FIELD(column, value1, value2, ..., valueN);

正文到此结束