Mysql数据查询in的时候如何排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据查询in的时候如何排序相关的知识,希望对你有一定的参考价值。

参考技术A 前几天工作上遇到一个问题,在mysql数据查询的时候,使用的是in条件,而结果需要根据in来进行排序,当时尝试了几次都没成功,后来在度娘的帮助下,找到了解决办法:

select * from table_name where id in (6,2,1,10,5,7..)

查询的结果和in中的顺序并不一致,也就是说在批量查询时,mysql的查询并不是按照in中的值得顺序来查询的。那怎么才能保证和in查询中的顺序相同呢?

查询了资料发现有两种方式可以对in查询的结果进行排序。一种是order by find_in_set,另外一种是order by substring_index

1、select * from table_name where id in (6,2,1,10,5,7..) order by find_in_set(id,'6,2,1,10,5,7');

2、select * from table_name where id in (6,2,1,10,5,7..) order by substring_index('6,2,1,10,5,7',id,1);

mysql find_in_set(str,strlist)函数使用(in 按照里面的id排序)

博主在开发中遇到这样一个问题:
 
select * from `user` whereid in(23,1,55,94)
当执行类似这样一条sql 的时候,mysql都会事先将id排序再去查找:
 
          说明:这个在高性能mysql里面有介绍,in查询其实是一个扫表的过程,in查询时,底层是先将in里面的id就从小到大排序优化,然后再执行in查询的,所以
最好是手动将id从小到大排序后再执行in查询,例如in (1,23,55,94),然后再按照你想要的顺序排序就好了
 
         但是业务要求查询结果需要按照 in 里面id的顺序(即23,1,55,23,94的顺序 )返回,这时候该怎么做呢?
 
这条语句就可以搞定,是不是很方便 : select * from `user` where FIND_IN_SET(id,‘23,1,55,94‘)
 
   题外话:还有个不推荐的但可行方式,就是拿到id的数组后遍历分开查库,这样肯定会影响不少性能。。。

以上是关于Mysql数据查询in的时候如何排序的主要内容,如果未能解决你的问题,请参考以下文章

MySql用IN查询时(或类似IN),如何保证按输入的顺序显示

mysql find_in_set(str,strlist)函数使用(in 按照里面的id排序)

准备好的语句,`WHERE .. IN(..)` 查询和排序 - 使用 MySQL

根据 WHERE IN 子句数据排序结果集

mysql 按指定规则排序

2021-06-07 mysql索引 + 排序