按列排序MySQL行,但不按字母顺序排序

时间:2013-03-20 13:10:44

标签: mysql

如果标题有点含糊不清并让人联想到其他半相关问题,我们很抱歉,问题实际上非常简单。

我有一个VARCHAR列,它可以包含1个字符的值,例如M,G,D and S。如果我按字母顺序对结果进行排序,则在此示例中,它将按顺序显示它们:D-G-M-S。但是,我需要按以下顺序显示行:

G-D-M-S

有没有办法在查询中完成此操作?我知道我可以在PHP中对结果进行自定义排序,但如果可能的话,我宁愿在查询中执行此操作。对于这个例子,我只需要在结果中切换“G”和“D”的顺序,这个简单问题的解决方案就足以满足任何答案。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我要做的是定义一个包含2列的临时表或永久表:

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

然后你将你现有的表加入到字母“letter”上的新表中,并使用新表“ordernum”字段进行排序......

答案 2 :(得分: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

答案 3 :(得分: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 ;