iT邦幫忙

1

SQL 排序的問題

sql


在type中有easy,normal,hard這三種值,SQL要如何排序使之成為easy->normal->hard
如果直接用order by 會變成用字母排序 easy->hard->normal

不懂,
以 easy, normal , hard 排序
排出來的是三「坨」資料
如此有什麼用意呢?

沒想到這問題引起如此熱烈的回答
我也提供一個不一樣的做法

UPDATE TABLENAME SET TYPE='1.easy' WHERE TYPE='easy'
UPDATE TABLENAME SET TYPE='2.normal' WHERE TYPE='normal'
UPDATE TABLENAME SET TYPE='3.hard' WHERE TYPE='hard'

SELECT * FROM TABLENAME ORDER BY TYPE

收工放飯
jamesjan iT邦高手 1 級 ‧ 2008-12-16 08:24:08 檢舉
在不變動原始資料的情況下,應該是要加上一個供排序的欄位如 ord int
然後下 Update Statement
update DB_Table_Name set ord=1 where type='easy'
update DB_Table_Name set ord=2 where type='nromal'
update DB_Table_Name set ord=3 where type='hard'

並對 ord 欄位建 index

Select * from DB_Table_Name order by ord

變更Table Schema要等 User 離線時進行,否則會有 Lock 的現象
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
29
沉默深河
iT邦新手 5 級 ‧ 2008-12-14 18:46:42
最佳解答

我的作法會是
建立一個存放type的表格
例如
MYTYPE

id name

1 easy
2 normal
3 hard
再將這兩個join起來用MYTYPE.id來排序

鐵殼心 iT邦高手 1 級 ‧ 2008-12-14 21:29:49 檢舉

是的是的, 這是一種作法.
另外偷懶的方法是直接把 Easy/Normal/Hard用數字代替, 另外再加註解就可以了.

26
oxox
iT邦研究生 3 級 ‧ 2008-12-14 22:28:12

我用的笨方法為:

<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
sheng514 iT邦新手 1 級 ‧ 2008-12-15 08:19:15 檢舉

此方式若當資料多的時候難免有點慢
若該欄位是固定幾種型態,建議用代碼來取代是最好的
因為都是相同的文字不需要再多存這類的垃圾資訊

sheng514 iT邦新手 1 級 ‧ 2008-12-15 08:20:04 檢舉

我所謂的查詢會變慢是用了case 的條件式

oxox iT邦研究生 3 級 ‧ 2008-12-15 08:56:36 檢舉

謝謝大家的指導..^^

如果可以異動資料庫,會建議多一個用來排序的欄位
直接就是 1 2 3 這樣,不用查詢時才作..
如果因為程式寫死或是修改困難,就自己定期下SQL來異動那個欄位吧..
==>在下實際經驗,
列報表時,某人就是希望他的名字放在第一個,用姓名排一定不對,只好用上述的方式了

22
jamesjan
iT邦高手 1 級 ‧ 2008-12-15 08:29:35

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

當資料量大時,數字欄位的排序會較快

18
timeriver
iT邦新手 4 級 ‧ 2008-12-15 10:00:53

直接把資料庫的 easy、normal、hard 用字元取代成 1、2、3 or A、B、C
這樣在執行 SQL 時應該是更快的

18
old7ada
iT邦研究生 2 級 ‧ 2008-12-15 10:25:37

當資料量大時,
用CASE是會變慢。
用SuperGy的方法,也是慢,因為要join table 再 sort

我的建議是做一次苦工,以後就輕鬆!
先在原table 新增一欄位(長度設1,以減少儲存空間),隨便塞入一個預設值,再用update的語法將
easy 設為 1 ,normal = 2 , hard = 3
再對該欄位設定index
以後select的時候就只要對該欄位就可

PS,以後新增資料,用程式將easy 就自動補上1,normal 就自動補上2.......

因此就算將來資料比數多,資料回覆的速度也不會差太多!

16
julie8tw
iT邦研究生 4 級 ‧ 2008-12-15 15:51:11

easy、normal、hard 用取代成 1、2、3 or A、B、C(另開TABLE)
其實這才是正規劃的做法啦,不過看你的量參考看看

18
filexlu
iT邦新手 4 級 ‧ 2008-12-15 17:45:09

樓上幾位大大,都提供了很棒的解答了...
我提供一個不正統亂搞的用法...
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囉!!

12
judgehsu
iT邦新手 4 級 ‧ 2008-12-16 22:32:46

如果,要讓 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下是沒問題的,如果,你用的是別的資料庫的話,也許也可以找到類似的語法。

10
terrychen05
iT邦新手 4 級 ‧ 2008-12-17 22:41:36

如果在每次做SELECT時或用JOIN的方式,只要SELECT就會浪費一點不必要的資源,提供一種做法如果該欄位已經是中文字了,那就加個欄位在他的旁邊存入easy,normal,hard的對應值1,2,3 舊資料下3次語法把easy update 成1 normal update 成2,hard update 成3

我要發表回答

立即登入回答