2015-03-02 111 views
1

您可以通過函數更改MySQL排序嗎?我試圖按照任意順序對我的值進行排序。按自定義順序對包含字母和符號的值進行排序

當前正在尋找方法來注入一個函數,可以幫助我在這裏添加一列並修改導入。

這就是我想要的順序:

AAA 
AA+ 
AA 
AA- 
A+ 
A 
A- 
BBB+ 
BBB 
BBB- 
BB+ 
BB 
BB- 
B+ 
B 
B- 
CCC+ 
CCC 
CCC- 
CC 

這是使用排序我的結果:

A 
A+ 
A- 
AA 
AA+ 
AA- 
AAA 
B 
B+ 
B- 
BB 
BB+ 
BB- 
BBB 
BBB+ 
BBB- 
C 
CC 
CCC 
CCC+ 
CCC- 

編輯: 嘗試,但得到的語法錯誤:

CREATE FUNCTION sortRating (s CHAR(20)) 
RETURNS INT(2) 
DECLARE var INT 
CASE s 
    WHEN 'AAA' THEN SET var = 1 
    WHEN 'AA+' THEN SET var = 2 
    ELSE 
     SET VAR = 3 
END CASE 
RETURN var 
END; 
+0

你只有在字符串的開頭字母? – 2015-03-02 16:32:07

+0

這組數值是有限的嗎?如果是這樣,那麼創建具有分配的等級值的查找表將是最容易的。 – 2015-03-02 16:32:28

+0

yes-值是有限的。正在研究用大量的case語句編寫我的第一個存儲過程。 @MichaelBerkowski - 查找表是什麼意思? – ovatsug25 2015-03-02 16:33:39

回答

5

這可以使用以下語法:

ORDER BY FIELD(<field_name>, comma-separated-custom-order) 

,例如,如果您想訂購由表達式稱爲rating,那麼你的ORDER BY條款內容如下:

ORDER BY FIELD(rating, 'AAA', 'AA+', 'AA', 'AA-', 'A+', 'A', 'A-', 
         'BBB+', 'BBB', 'BBB-', 'BB+', 'BB', 'BB-', 
         'B+', 'B', 'B-', 'CCC+', 'CCC', 'CCC-', 'CC') 

下面是對FIELD FUNCTION

+0

這個功能很棒!現在我只需要將此字符串追加到zf2查詢中。 :) – ovatsug25 2015-03-02 17:25:26

1

在這裏我看到一個模式文檔:

BBB+ 
BBB 
BBB- 
BB+ 
BB 
BB- 
B+ 
B 
B- 

將每個字符視爲一列並對此列中的每列進行排序R:

  1. 快報
  2. +
  3. 空字符串
  4. -
SELECT rating 
FROM test 
ORDER BY 
     MID(rating, 1, 1), 
    CASE MID(rating, 2, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END, 
    CASE MID(rating, 3, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END, 
    CASE MID(rating, 4, 1) WHEN '+' THEN 2 WHEN '' THEN 3 WHEN '-' THEN 4 ELSE 1 END 

SQL Fiddle

+0

有趣!謝謝!其他功能更容易,但這是非常好的和有益的 – ovatsug25 2015-03-02 17:25:57