您的位置:首页 > 数据库 > MySQL

Mysql "in" 排序问题

2015-05-13 17:12 561 查看
select * from table where id IN (3,6,9,1,2,5,8,7);


这样的情况取出来后,其实,id还是按1,2,3,4,5,6,7,8,9,排序的,但如果我们真要按IN里面的顺序排序怎么办?SQL能不能完成?是否需要取回来后再foreach一下?

其实可以这样

select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);


出来的顺序就是指定的顺序了

关于这种排序的效率,

有文章指出:

field(str,str1,str2,str3,…)
Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found.


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

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

作者建议在程序代码中自行排序。

但是也有人说这种排序不会出现什么性能瓶颈

具体还是自己测试一下吧。

$result =     $model->query("select ".$field." from `mi_city` where id in (".$where.") order by find_in_set('id','".$where."')");

$result =   $model->query("select ".$field." from `mi_city` where id in (".$where.")order by find_in_set(id,'".$where."')");


注意上面的两种Sql格式!find_in_set中第一个字段不应该加引号!否则会无效!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql