2013-04-16 47 views
1

下面的数据是字符串列,按升序排序:自定义排序在mysql中

1/44/104/66 
1/44/104/66/137 
1/44/104/66/138 
1/44/104/66/139 
1/44/104/66/140 
1/44/104/66/141 
1/44/104/66/142 
1/44/104/66/143 
1/44/104/66/67 
1/44/104/66/68 
1/44/104/66/69 

不过,我想这样的排序是:

1/44/104/66 
1/44/104/66/67 
1/44/104/66/68 
1/44/104/66/69 
1/44/104/66/137 
1/44/104/66/138 
1/44/104/66/139 
1/44/104/66/140 
1/44/104/66/141 
1/44/104/66/142 
1/44/104/66/143 
+0

AFIK这在SQL中是不可能的。 – rekire

+0

你只是按最后一列排序?用简单的英语,你会如何描述这种类型? –

+0

你可能在这里找到一些关于将字段作为整数进行数值排序的答案:http://stackoverflow.com/questions/4686849/sorting-varchar-field-numerically-in-mysql – showdev

回答

0

对于您拥有的数据,这应该工作:

order by length(col), col 

但是,这假定唯一的区别是在最后一列。

+0

如果字符串A大于字符串B(数字),但字符串A比字符串B短*会怎么样? PS:我(是)downvoter,但用户没有给出足够的细节,这个答案本身是不正确的。只是想我会指出 –

+0

@Evan。 。 。我的回答清楚地表明,它适用于问题中提供的数据,假设只有最后一个字段发生变化。有什么关于你不明白的答案吗? –

0

你可以尝试沿着线的东西:

select 
    Name 
from TableOne 
ORDER BY Cast(Replace(Name, "/", "") as UNSIGNED) 
0
SELECT * FROM myTable 
ORDER BY CAST(SUBSTRING_INDEX(DATA_COLUMN,"/",-1) AS UNSIGNED) ; 

它是如何工作的:

1:在你原来的顺序由顺序是不正确的,因为它是为lexographically比较字符串,而您想要基于整数值进行排序。

2.在此解决方案中,SUBSTRING_INDEX提取/后的最后一个值,然后将其转换为整数以给出所需的顺序。

3.您可以扩展相同的解决方案,以便通过数据模式中倒数第二,倒数第三个数字进行排序。

0

不是一个真正的美丽的查询,但它应该做你需要的东西:

SELECT s 
FROM 
    yourtable 
ORDER BY 
    s + 0, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>0 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 2), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>1 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 3), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>2 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 4), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>3 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 5), '/', -1)+0 
     ELSE 0 END 

请参阅小提琴here