最近在写一个项目,在项目中有一个要求是按照指定的用户指定顺序,对数据进行排序!网上百度了一下,感觉还是挺有用的,但是不是很清楚工作原理!
mysql的field()函数
filed(s,s1,s2....)函数返回第一个与字符串s匹配的字符串的位置
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函数本身的作用而言,函数返回第一个与字符串匹配的,字符串的位置!
那么,返回的岂不是一个数字么?那对排序而言又有什么意义呢?
Field对目标字段进行一个自定义排序
使用这个语句它会对字段status进行一个返回,其中4->1,2->2,1->3,3->4。
至于null的值,返回0。
5为什么在正序是顶部,倒序是底部?
因为5的返回值是0,而排序是根据返回值来排的。