MySL實現(xiàn)如等級成色等特殊順序的排序詳解
前言:
在涉及商品類的項目時,為了給同一類商品定位,往往會分等級或者成色。而等級/成色有時是用類似A,A+,A+1,K,L1,L2等英文與數(shù)字的組合進(jìn)行表述。既然是等級,自然就會區(qū)分高等級,低等級。有高有低,又給商品定了等級,所以到了商品列表展示,等級排序自然少不了。
項目在開始做的時候關(guān)于商品等級字段是直接存儲的上面的字母數(shù)字,也就是A,A+1之類的。所以在需要以等級排序的時候,以英文字母的方式升序倒序就出現(xiàn)了問題,比如大部分等級中,S是最高級,而英文倒序S排在了后面。
沖突:
直接以英文字母排序很顯然是不行的,于是首先想到的是數(shù)據(jù)表的等級字段改為int,存入數(shù)字。在配置里或者單獨建一張表與對應(yīng)數(shù)字關(guān)聯(lián)一個等級。類似K對應(yīng)1之類的,需要升序降序就對數(shù)字排序,這樣就解決了S排序問題。但是,現(xiàn)實的是商品表的數(shù)據(jù)量極大,如果要給原來的等級做關(guān)聯(lián),就要小心的寫SQL替換或者手動一個一個改。不知道有沒有在不需要修改表的情況下解決那種特殊字符排序的方法,后來還真想到了一個方法。
解決方法:
通過使用MySQL的find_in_set函數(shù),通過自定義的順序進(jìn)行排序,所以后續(xù)將某個等級提前改動都不會那么被動了,如下示例。
1. 可以先定義升序,倒序的排列
"grade_desc" => ["S","A+","A1","A2","B+1","B+2","B1","B2","C+1","C+2","C1","C2","D+1","D+2","D1","D2","D3","E+1","E+2","E1","E2","F","G+","G1","G2","H+","H1","H2","I+","I1","I2","J+","J","K+","K"]"grade_asc" => ["K","K+","J","J+","I2","I1","I+","H2","H1","H+","G2","G1","G+","F","E2","E1","E+2","E+1","D3","D2","D1","D+2","D+1","C2","C1","C+2","C+1","B2","B1","B+2","B+1","A2","A1","A+","S"]
2. 查詢示例
3. ThinkPHP5的使用方式
3.1. 升序
$list = GoodsItem::where('delete_time','=',0) ->field('id,grade') ->orderRaw("find_in_set(grade,'K,K+,J,J+,I2,I1,I+,H2,H1,H+,G2,G1,G+,F,E2,E1,E+2,E+1,D3,D2,D1,D+2,D+1,C2,C1,C+2,C+1,B2,B1,B+2,B+1,A2,A1,A+,S')") ->select(); return $list->toArray();
3.2. 倒序
$list = GoodsItem::where('delete_time','=',0) ->field('id,grade') ->orderRaw("find_in_set(grade,'S,A+,A1,A2,B+1,B+2,B1,B2,C+1,C+2,C1,C2,D+1,D+2,D1,D2,D3,E+1,E+2,E1,E2,F,G+,G1,G2,H+,H1,H2,I+,I1,I2,J+,J,K+,K')") ->select(); return $list->toArray();
3.3.效果
4. find_in_set函數(shù)
這個函數(shù)可以放在where中使用,查詢字段是否存在某個范圍內(nèi),有點像IN,但還是有區(qū)別,具體的后期補(bǔ)上。
以上就是MySQL實現(xiàn)如等級成色等特殊順序的排序詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL特殊順序排序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則
這篇文章主要介紹了MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-08-08Mysql行與列的多種轉(zhuǎn)換(行轉(zhuǎn)列,列轉(zhuǎn)行,多列轉(zhuǎn)一行,一行轉(zhuǎn)多列)
在MySQL中,行轉(zhuǎn)列和列轉(zhuǎn)行都是非常有用的操作,本文就來介紹一下Mysql行與列的多種轉(zhuǎn)換,主要包括行轉(zhuǎn)列,列轉(zhuǎn)行,多列轉(zhuǎn)一行,一行轉(zhuǎn)多列,具有一定的參考價值,感興趣的可以了解一下2023-08-08