MySQL 按照指定的欄位排序
說明
研發的同事問:怎麼能讓某個欄位按照他指定的順序排序呢
在幫忙其解決問題過程中,發現有多種方法可以實現,見下文
測試資料
drop table a;
create table a (x varchar(10),y varchar(10));
insert into a values('yujx','all'),('oracle','pc'),('mysql','mobile');
#表a的測試資料如下
#預設的按y排序(升序或降序)結果
|
現在想按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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 欄位按照指定 ID 順序進行排序排序
- mysql 字串型別的數值欄位按照數值的大小進行排序MySql字串型別排序
- mysql5.6生成排序欄位MySql排序
- mysql資料表按照某個欄位分類輸出MySql
- Mysql替換欄位中指定字元(replace 函式)MySql字元函式
- es 更新指定欄位的方法
- Js實現Object按照值的某個欄位(數值型別)的大小進行排序JSObject型別排序
- arcgis欄位值計算(擷取A欄位前8位+按照順序計算8位)
- linux 中awk命令實現按照 指定的字元對文字進行排序Linux字元排序
- MongoDB(13)- 查詢操作返回指定的欄位MongoDB
- mysql 如何替換資料表欄位字串中指定單詞的內容MySql字串
- Spring MVC @SortDefault多欄位排序SpringMVC排序
- SQL字元型欄位按數字型欄位排序實現方法SQL字元排序
- MySQL欄位的取值範圍MySql
- MySQL 欄位約束MySql
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- Django-ORM 之指定欄位別名DjangoORM
- 模型聯合查詢返回指定欄位模型
- 按照價格排序!排序
- MySQL按指定順序排序(order by field的使用)MySql排序
- 記錄一下mysql多欄位排序遇到的一個好玩的現象MySql排序
- java8的stream將一個List轉為按照某個欄位分組的map,再按照另一個欄位取max最終得到一個mapJava
- MySQL 中 JSON 欄位的使用技巧MySqlJSON
- MySQL中JSON欄位的使用技巧MySqlJSON
- Laravel Tips:指定自增欄位起始值Laravel
- MySQL-刪除欄位MySql
- MySQL 欄位擷取拼接MySql
- MySQL 大欄位問題MySql
- 要慎用mysql的enum欄位的原因MySql
- 逆向工程通過某個欄位排序排序
- 記如何在預載入中指定查詢的欄位
- MybatisPlus經典示例:使用Wrapper查詢指定欄位並新增欄位函式處理MyBatisAPP函式
- vxe-table grid 使用服務端排序、多欄位排序服務端排序
- MySQL-去掉不為null的欄位MySqlNull
- 5_MySQL 表的欄位約束MySql
- mysql表操作(alter)/mysql欄位型別MySql型別
- Django筆記十二之defer、only指定返回欄位Django筆記
- MySQL-建立計算欄位MySql
- MySQL欄位型別最全解析MySql型別