选择查询字符数字ID通过递减订购

问题描述 投票:1回答:4

我有示例数据

SMMP022011304196
SMMP022011304199    
SMMP022011304197    
SMMP022011304193
SMMP022011304195    
SMMP022011304198    
SMMP022011304192    
SMMP0220113041910   
SMMP022011304191
SMMP022011304194

如果我使用SELECT myfield from mytable order by myfield DESC我造成这样的

SMMP022011304199    
SMMP022011304198    
SMMP022011304197    
SMMP022011304196    
SMMP022011304195    
SMMP022011304194    
SMMP022011304193    
SMMP022011304192    
SMMP0220113041910   
SMMP022011304191

请帮忙做的结果是这样的:

SMMP0220113041910   
SMMP022011304199    
SMMP022011304198    
SMMP022011304197    
SMMP022011304196    
SMMP022011304195    
SMMP022011304194    
SMMP022011304193    
SMMP022011304192    
SMMP022011304191
mysql sql sql-order-by natural-sort
4个回答
2
投票

只是排序字段的长度,然后用长度相等的值:

SELECT myfield from mytable order by 
LENGTH(myfield) DESC,
myfield DESC

SQLFiddle demo


1
投票

如果数据总是有SMMP在前面,你可以使用如下:

ORDER BY LPAD(REPLACE(myfield,'SMMP',''),15,'0') desc;

该方法的逻辑是忽略在前面的4的炭和仅次于排序数字的数字。


1
投票

继我先前的评论,排序如下: -

SELECT myfield
FROM mytable
ORDER BY SUBSTRING(myfield, 1, 4) DESC, cast(SUBSTRING(myfield, 5) AS unsigned) DESC

请注意,这仅适用于如果你的领域是固定格式的,随后用NUMERICS 4个字符


1
投票

这是工作的罚款。下面的代码是SQL Server 2008 R2的工作:

SELECT 
   myfield  
FROM mytable 
ORDER BY 
    LEN(myfield) DESC 
    ,myfield DESC
© www.soinside.com 2019 - 2024. All rights reserved.