2015-03-02 110 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