按列排序MySQL行,但不按字母顺序排列
对不起,如果标题有点模棱两可,让人联想到其他半相关问题),这个问题其实很简单。按列排序MySQL行,但不按字母顺序排列
我有一个VARCHAR列可以有1个字符的值,如M,G,D and S
。如果按字母顺序对结果进行排序,则在此示例中,将按照以下顺序显示它们:D-G-M-S
。但是,我需要按以下顺序显示行:
G-D-M-S
有没有办法在查询内完成这项工作?我知道我可以在PHP中对结果进行自定义排序,但如果可能的话,我宁愿在查询内部进行排序。对于这个例子,我只需要在结果中切换“G”和“D”的顺序,对于这个简单问题的解决方案就可以满足任何答案。
您可以编写自定义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
我会做的是确定一个临时或2列永久表:
letter | ordernum
-------------------
G | 1
D | 2
M | 3
S | 4
然后你加入你退出表在球场上“信”是新的,并使用新表“ORDERNUM”字段做排序...
谢谢,但我想我会用danihp的答案中的case语句去做(尽管我看到这样会工作也是,我宁愿避免多余的表)。 – jovan 2013-03-20 13:19:33
这取决于你是否更新你的数据库或你的代码(查询)是否有新的值进来......我正在一个比代码更容易部署/更改数据库的环境中工作...... – 2013-03-20 13:36:16
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
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 ;
你怎么知道什么样的顺序,他们应该在? – 2013-03-20 13:12:13
看来,如果数据库应该知道顺序,那么比向表中添加一个'order_index'列或类似的东西。如果数据库不应该知道订单,那么可以在PHP端执行,也许在配置文件中。我可能有错误的想法,因为我对你的情况了解不多,但这是我的倾向。 – 2013-03-20 13:13:46
@ExplosionPills这里的任务只是在结果中切换G和D的顺序。 – jovan 2013-03-20 13:17:25