2013-03-20 173 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 ;