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字串型別排序
- mysql中文欄位排序MySql排序
- PHP指定欄位的多維陣列排序方法PHP陣列排序
- 欄位排序排序
- json 按照欄位分類JSON
- MySql Order By 多個欄位 排序規則MySql排序
- mysql5.6生成排序欄位MySql排序
- mysql資料表按照某個欄位分類輸出MySql
- Mysql替換欄位中指定字元(replace 函式)MySql字元函式
- 巧用欄位對映實現指定欄位的搜尋
- Js實現Object按照值的某個欄位(數值型別)的大小進行排序JSObject型別排序
- arcgis欄位值計算(擷取A欄位前8位+按照順序計算8位)
- Mysql根據指定欄位的int值查出在當前列表的排名MySql
- mysql按照漢字拼音進行order by排序MySql排序
- mysql_select按照指定的格式輸出到檔案MySql
- 【MySql】mysql 欄位個數的限制MySql
- MongoDB(13)- 查詢操作返回指定的欄位MongoDB
- SQL字元型欄位按數字型欄位排序實現方法SQL字元排序
- mysql 如何替換資料表欄位字串中指定單詞的內容MySql字串
- linux 中awk命令實現按照 指定的字元對文字進行排序Linux字元排序
- MySQL欄位的取值範圍MySql
- mysql的text欄位長度MySql
- MySQL 欄位約束MySql
- 按照價格排序!排序
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- Django-ORM 之指定欄位別名DjangoORM
- 模型聯合查詢返回指定欄位模型
- oracle中如何指定表欄位自增Oracle
- 從10g開始CBO下group by之後不能保證資料是按照分組欄位排序的!排序
- Spring MVC @SortDefault多欄位排序SpringMVC排序
- LINQ 按多個欄位排序排序
- jQuery對Table一個欄位排序jQuery排序
- 記錄一下mysql多欄位排序遇到的一個好玩的現象MySql排序
- java8的stream將一個List轉為按照某個欄位分組的map,再按照另一個欄位取max最終得到一個mapJava
- MySQL按指定順序排序(order by field的使用)MySql排序
- MySQL-刪除欄位MySql
- MySQL 大欄位問題MySql