2013-03-20 174 views
0

對不起,如果標題有點模棱兩可,讓人聯想到其他半相關問題),這個問題其實很簡單。按列排序MySQL行,但不按字母順序排列

我有一個VARCHAR列可以有1個字符的值,如M,G,D and S。如果按字母順序對結果進行排序,則在此示例中,將按照以下順序顯示它們:D-G-M-S。但是,我需要按以下順序顯示行:

G-D-M-S 

有沒有辦法在查詢內完成這項工作?我知道我可以在PHP中對結果進行自定義排序,但如果可能的話,我寧願在查詢內部進行排序。對於這個例子,我只需要在結果中切換「G」和「D」的順序,對於這個簡單問題的解決方案就可以滿足任何答案。

+0

你怎麼知道什麼樣的順序,他們應該在? – 2013-03-20 13:12:13

+0

看來,如果數據庫應該知道順序,那麼比向表中添加一個'order_index'列或類似的東西。如果數據庫不應該知道訂單,那麼可以在PHP端執行,也許在配置文件中。我可能有錯誤的想法,因爲我對你的情況瞭解不多,但這是我的傾向。 – 2013-03-20 13:13:46

+0

@ExplosionPills這裏的任務只是在結果中切換G和D的順序。 – jovan 2013-03-20 13:17:25

回答

4

您可以編寫自定義case聲明:

Select * 
from your_table 
order by 
    case your_column 
    when 'G' then 1 
    when 'D' then 2 
    when 'M' then 3 
    when 'S' then 4 
    end 

此外,另一種解決方案,是在物理層次上的變化歸類:

Change default Sorting by Adding a Simple Collation to an 8-Bit Character Set

+0

我不想亂用排序規則,我只需要在一個表中的一列上進行切換。案件看起來像我正在尋找的解決方案,謝謝。 – jovan 2013-03-20 13:18:46

+0

我不建議你改變排序規則,我只是說存在這種可能性,而且,你也可以創建自己的排序規則。只有當您需要高性能時,更改排序規則纔是解決方案。 – danihp 2013-03-20 13:20:05

+0

你認爲'case'語句會比在表中添加另一列並且每個字母都帶有索引(G代表1,D代表2),並使用它來排序? – jovan 2013-03-20 13:22:13

1

我會做的是確定一個臨時或2列永久表:

letter | ordernum 
------------------- 
G  | 1 
D  | 2 
M  | 3 
S  | 4 

然後你加入你退出表在球場上「信」是新的,並使用新表「ORDERNUM」字段做排序...

+0

謝謝,但我想我會用danihp的答案中的case語句去做(儘管我看到這樣會工作也是,我寧願避免多餘的表)。 – jovan 2013-03-20 13:19:33

+0

這取決於你是否更新你的數據庫或你的代碼(查詢)是否有新的值進來......我正在一個比代碼更容易部署/更改數據庫的環境中工作...... – 2013-03-20 13:36:16

1
SELECT 
    if(columnname='G',1, 
     if(columnname='D',2, 
      if(columnname='M',3, 
       if(columnname='S',4,0 
    )))) SortOrder 
FROM tablename 
ORDER BY 
    SortOrder ASC 
1
Select col from table 
    order by case when col = 'G' then 1 
    when col = 'D' then 2 
    when col = 'M' then 3 
    case when col = 'S' then 4 else 5 end ;