如何用sql實現自己想要的order排序
- 2019 年 10 月 8 日
- 筆記
一、需求背景
萬惡的產品經理,在不同場景有不同的排序需求,有時候根據欄位 0 1 2 升序 ,有時候又是1 2 0 這樣排序,重點是還要分頁,就無法使用程式碼去實現排序,只能用純sql語句。
假設現在有一個訂單表,表裡有個欄位為pay_status,0為未支付,1為已支付,2為支付失敗
如果按照 支付失敗->已支付->未支付(2,1,0) 排序,使用以下sql語句即可
select * from table_order order by pay_status desc
但是想按照 已支付->支付失敗->未支付(1,2,0) 排序,就不能簡單地根據這個欄位使用desc或者asc了。
二、FIELD()函數
FIELD(str,str1,str2,str3,…)
返回str 在str1, str2, str3, …列表其中的索引(位置從1開始)。如果str沒有找到,返回0。
SQL> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); +---------------------------------------------------------+ | FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec)
解決思路:使用原值進行對比,生成一個新的值,再根據此值排序
select * from table_order order by FIELD(pay_status,1,2,0) asc
三、IF()函數
IF(expr1,expr2,expr3)
sva=1; IF(sva=1,"男","女"); 男
解決思路:先判斷某個值是否為目標值,先進行第一遍排序,然後再對剩餘值排序
select * from table_order order by IF(pay_status=1,1,0) asc,pay_status desc