首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

MySql中Where语句IN的排序方法详解

建站高手 2015-4-27 [MYSQL] 来自PC 复制链接
22920
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
in命令在mysql中是包含的意思,下面详细是活下MySql中Where语句IN的排序方法:

mysql在批量查询时,通过in查询的结果和in中的值的顺序并不一致,对此mysql也有针对in的排序方式。具体查询如下:

第一种方式,order by field,按字段查询,示例:
  1. select * from table where id in (5,3,6,1) order by field(id,5,3,6,1);
复制代码

排序过程:把选出的记录的 id 在 FIELD 列表中进行查找,并返回位置,以位置作为排序依据。

注意:这样的用法,会导致 Using filesort,是效率很低的排序方式。除非数据变化频率很低,或者有长时间的缓存,否则不建议用这样的方式排序。

第二种方式,order by substring_index,此排序用到了substring_index(str,delim,count)函数,截断in中id字符串进行排序,示例:
  1. select * from table where id in (51,3,6,5) order by substring_index(concat(',',replace('51,3,6,5',',',',,'),','),concat(',',id,','),1);
复制代码

排序过程:返回字符串str中在第count个出现的分隔符delim之前的子串。如果count是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符。最后查询出substring_index结果后,对此进行排序。

注意:由于截取方式的原因,如果后面字符与前面字符处于包含关系例如上述例子中的5和51,这样会导致截取出你不想要的结果(把51拆分,而不是拆分逗号)从而使排序出错,所以在上面例子中加入替换方法,把str中的 ',' 号替换为',,' ,然后左右两侧加上','然后在处理后的这个字符串中 用 ','+ID',' 来进行截断,就不会出现截取错误的情况了。

第三种方式,order by find_in_set,此排序用到了find_in_set(str,strlist)函数,根据str在strlist中的位置分配由1到N的数值进行排序,示例:
  1. select * from table where id in (5,3,6,1) order by find_in_set(id,'5,3,6,1');
复制代码

排序过程:字符串str在由N子链组成的字符串列表strlist 中,则返回值的范围在1到N之间 。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串,最后根据返回字符串在对应的strlist中的key值进行排序。

注意:因为函数主要是用‘,’区分,所以排序字符中不能有‘,’。

表结构如下:
mysql> select * from test;
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
| 4 | test4 |
| 5 | test5 |
+----+-------+
执行以下SQL:
mysql> select * from test where id in(3,1,5);
+----+-------+
| id | name |
+----+-------+
| 1 | test1 |
| 3 | test3 |
| 5 | test5 |
+----+-------+
3 rows in set (0.00 sec)
这个select在mysql中得结果会自动按照id升序排列,

但是我想执行"select * from test where id in(3,1,5);"的结果按照in中得条件排序,即:3,1,5,

想得到的结果如下:
id name
3 test3
1 test1
5 test5
请问在这样的SQL在Mysql中怎么写?

网上查到sqlserver中可以用order by charindex解决,但是没看到Mysql怎么解决??请高手帮忙,谢谢!

select * from a order by substring_index('3,1,2',id,1);
试下这个good,ls正解。

order by find_in_set(id,'3,1,5')
谢谢,经测试order by substring_index和order by find_in_set都可以



上一篇:把地区SEO做到第一名的方法《第二篇》
下一篇:js中callee与caller的区别
ww456123 发表于 2015-5-2 16:16:19 来自PC
无回帖,不论坛,这才是人道。
small_yun 发表于 2015-8-11 13:37:20 来自PC
很好的帖子
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表