MySQL 按照指定的欄位排序

jx_yu發表於2016-04-01

說明

           研發的同事問:怎麼能讓某個欄位按照他指定的順序排序呢

           在幫忙其解決問題過程中,發現有多種方法可以實現,見下文

 

測試資料

drop table a;

create table a (x varchar(10),y varchar(10));

insert into a values('yujx','all'),('oracle','pc'),('mysql','mobile');

#a的測試資料如下
MySQL>select * from a;
+--------+--------+
| x      | y      |
+--------+--------+
| yujx   | all    |
| oracle | pc     |
| mysql  | mobile |
+--------+--------+
3 rows in set (0.00 sec)

#預設的按y排序(升序或降序)結果
MySQL>select * from a order by y;
+--------+--------+
| x      | y      |
+--------+--------+
| yujx   | all    |
| mysql  | mobile |
| oracle | pc     |
+--------+--------+
3 rows in set (0.00 sec)


MySQL>select * from a order by y desc;
+--------+--------+
| x      | y      |
+--------+--------+
| oracle | pc     |
| mysql  | mobile |
| yujx   | all    |
+--------+--------+
3 rows in set (0.00 sec)

 

現在想按mobile->all->pc的順序排序,可使用如下方法

方法一:使用 FIND_IN_SET(str,strlist) 函式
MySQL>select * from a order by find_in_set(y,'mobile,all,pc');
+--------+--------+
| x      | y      |
+--------+--------+
| mysql  | mobile |
| yujx   | all    |
| oracle | pc     |
+--------+--------+
3 rows in set (0.00 sec) 

方法二:使用FIELD(str,str1,str2,str3,...)函式
#FIELD
函式主要用途會返回值在後面列表中的位置,如下
MySQL>select x,y,field(y,'mobile','pc','all') sort_Nu from a order by field(y,'mobile','pc','all');   
+--------+--------+---------+
| x      | y      | sort_Nu |
+--------+--------+---------+
| mysql  | mobile |       1 |
| oracle | pc     |       2 |
| yujx   | all    |       3 |
+--------+--------+---------+
3 rows in set (0.00 sec)

方法三:使用 SUBSTRING_INDEX(str,delim,count) 函式
MySQL>select * from a order by substring_index('mobile,all,pc',y,1);
+--------+--------+
| x      | y      |
+--------+--------+
| mysql  | mobile |
| yujx   | all    |
| oracle | pc     |
+--------+--------+
3 rows in set (0.00 sec)
#
看下面 substring_index('mobile,all,pc',y,1) 取值,可知按b列的值排序 y的順序固然就是 mobile,all,pc
MySQL>select y,substring_index('mobile,all,pc',y,1) b  from a;
+--------+-------------+
| y      | b           |
+--------+-------------+
| all    | mobile,     |
| pc     | mobile,all, |
| mobile |             |
+--------+-------------+
3 rows in set (0.00 sec)

 

方法四:使用case when

MySQL>select x,y,case when y='mobile' then 1 when y='all' then 2 when y='pc' then 3 end sort_nu from a order by  case when y='mobile' then 1 when y='all' then 2 when y='pc' then 3 end;

+--------+--------+---------+
| x      | y      | sort_nu |
+--------+--------+---------+
| mysql  | mobile |       1 |
| yujx   | all    |       2 |
| oracle | pc     |       3 |
+--------+--------+---------+
3 rows in set (0.00 sec)

綜上,如果想讓欄位按照指定的順序排序,根本宗旨是想辦法根據排序欄位的值和最終排序順序組合出新的虛擬欄位,用虛擬欄位的值用來排序。

 

上述4種方法,推薦使用方法1和方法2 比較好理解

 

關於上面用到的函式說明,請參考:
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_field


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27000195/viewspace-2073596/,如需轉載,請註明出處,否則將追究法律責任。

相關文章