mysql自动排序

最近在写一个项目,在项目中有一个要求是按照指定的用户指定顺序,对数据进行排序!网上百度了一下,感觉还是挺有用的,但是不是很清楚工作原理!

mysql的field()函数

filed(s,s1,s2....)函数返回第一个与字符串s匹配的字符串的位置

clipboard.png

mysql自定义排序的例子

准备数据

create table zero (
id int primary key AUTO_INCREMENT,
status tinyint not null default 0,
name varchar(20) not null default ''
)engine=myisam charset=utf8


insert into zero (status,name) values 
                                        (1,'name1'),
                                        (2,'name2'), 
                                        (3,'name3'),
                                        (2,'name4'),
                                        (4,'name5'),
                                        (5,'name6');

得到的表数据如下

mysql> select * from zero;
        +----+--------+-------+
        | id | status | name  |
        +----+--------+-------+
        |  1 |      1 | name1 |
        |  2 |      2 | name2 |
        |  3 |      3 | name3 |
        |  4 |      2 | name4 |
        |  5 |      4 | name5 |
        |  6 |      5 | name6 |
        +----+--------+-------+
        6 rows in set (0.00 sec)

按照状态进行自定义排序

mysql> select * from zero order by field(status, 4,2,1,3,5);
                                        +----+--------+-------+
                                        | id | status | name  |
                                        +----+--------+-------+
                                        |  5 |      4 | name5 |
                                        |  2 |      2 | name2 |
                                        |  4 |      2 | name4 |
                                        |  1 |      1 | name1 |
                                        |  3 |      3 | name3 |
                                        |  6 |      5 | name6 |
                                        +----+--------+-------+
                                        6 rows in set (0.00 sec)

//注意:这里是将所有的状态都进行了列举

mysql> select * from zero order by field(status, 4,2,1,3) ;
                                        +----+--------+-------+
                                        | id | status | name  |
                                        +----+--------+-------+
                                        |  6 |      5 | name6 |
                                        |  5 |      4 | name5 |
                                        |  2 |      2 | name2 |
                                        |  4 |      2 | name4 |
                                        |  1 |      1 | name1 |
                                        |  3 |      3 | name3 |
                                        +----+--------+-------+
                                        6 rows in set (0.00 sec)

//注意:这里并没有列举状态5,此时状态5出现在了最上面


mysql> select * from zero order by field(status, 4,2,1,3) desc ;
                                        +----+--------+-------+
                                        | id | status | name  |
                                        +----+--------+-------+
                                        |  3 |      3 | name3 |
                                        |  1 |      1 | name1 |
                                        |  2 |      2 | name2 |
                                        |  4 |      2 | name4 |
                                        |  5 |      4 | name5 |
                                        |  6 |      5 | name6 |
                                        +----+--------+-------+
                                        6 rows in set (0.00 sec)

//注意:这里并没有列举状态5,此时状态5出现了最下面

mysql> select * from zero where status in (1,2,4,5) order by field(status, 4,2,1,5) ;
                                        +----+--------+-------+
                                        | id | status | name  |
                                        +----+--------+-------+
                                        |  5 |      4 | name5 |
                                        |  2 |      2 | name2 |
                                        |  4 |      2 | name4 |
                                        |  1 |      1 | name1 |
                                        |  6 |      5 | name6 |
                                        +----+--------+-------+
                                        5 rows in set (0.00 sec)

我的疑问!

上面仅仅是自定排序的用法,但是,我并不是特别明白filed函数,究竟在排序中发挥了什么样的作用。按照filed函数本身的作用而言,函数返回第一个与字符串匹配的,字符串的位置!
那么,返回的岂不是一个数字么?那对排序而言又有什么意义呢?

阅读 5.2k
2 个回答

Field对目标字段进行一个自定义排序

field(status, 4,2,1,3)

使用这个语句它会对字段status进行一个返回,其中4->1,2->2,1->3,3->4。
至于null的值,返回0。
5为什么在正序是顶部,倒序是底部?
因为5的返回值是0,而排序是根据返回值来排的。

FIELD(str,str1,str2,str3,...)

field函数返回的是str在列表[str1,str2,str3...]中的索引(即位置),然后根据结果来排序。NULL值不等于任何值在列表中无法匹配,所以NULL值或者不存在列表中的值都返回0。这个在select * from zero order by field(status, 4,2,1,3) ;中体现了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题