在type中有easy,normal,hard這三種值,SQL要如何排序使之成為easy->normal->hard
如果直接用order by 會變成用字母排序 easy->hard->normal
1 easy
2 normal
3 hard
再將這兩個join起來用MYTYPE.id來排序
我用的笨方法為:
<pre class="c" name="code">
Select id,name,type,
case when type='easy' then '1 easy'
when type='normal' then '2 normal'
when type='hard' then '3 hard' end as typesorting
from DB_Table_Name
order by typesorting
oxox大大的方法就可以了(應該是最簡單聰明的方法),提供另一種寫法
<pre class="c" name="code">
Select id,name,type,
case type when 'easy' then 1
when 'normal' then 2
when 'hard' then 3
end as ord
from DB_Table_Name
order by ord
當資料量大時,數字欄位的排序會較快
直接把資料庫的 easy、normal、hard 用字元取代成 1、2、3 or A、B、C
這樣在執行 SQL 時應該是更快的
當資料量大時,
用CASE是會變慢。
用SuperGy的方法,也是慢,因為要join table 再 sort
我的建議是做一次苦工,以後就輕鬆!
先在原table 新增一欄位(長度設1,以減少儲存空間),隨便塞入一個預設值,再用update的語法將
easy 設為 1 ,normal = 2 , hard = 3
再對該欄位設定index
以後select的時候就只要對該欄位就可
PS,以後新增資料,用程式將easy 就自動補上1,normal 就自動補上2.......
因此就算將來資料比數多,資料回覆的速度也不會差太多!
easy、normal、hard 用取代成 1、2、3 or A、B、C(另開TABLE)
其實這才是正規劃的做法啦,不過看你的量參考看看
樓上幾位大大,都提供了很棒的解答了...
我提供一個不正統亂搞的用法...
easy 的第四個字是 y
normal 的第四個字是 m
hard 的第四個字是 d
SELECT id,name,type[4,4]
FROM table_name
ORDER BY 3 DESC
以上是Informix的語法,請看看就好...
正常的排序,會出現 d,m,y 也就是hard,normal,easy
加個DESC就會變成遞減了。
就變成y,m,d 也就是easy,normal,hard囉!!
如果,要讓 easy->normal->hard這樣子排,方式也很多!
比較簡單的方式,就是在查詢式中,把 easy 取代成1、normal取代成2、hard取代成3
SELECT REPLACE(REPLACE(REPLACE(type,'easy','1'),'normal','2'),'hard','3') as sort_id FROM 你的table名稱 order by sort_id
這個是ms sql server下是沒問題的,如果,你用的是別的資料庫的話,也許也可以找到類似的語法。
如果在每次做SELECT時或用JOIN的方式,只要SELECT就會浪費一點不必要的資源,提供一種做法如果該欄位已經是中文字了,那就加個欄位在他的旁邊存入easy,normal,hard的對應值1,2,3 舊資料下3次語法把easy update 成1 normal update 成2,hard update 成3