按SQL升序中的数值排序

时间:2012-12-04 04:10:48

标签: php mysql sql-order-by

我正试图获得此输出。

MDT 1
MDT 2
MDT 3
MDT 11
MDT 44

但是,值按字母顺序排序,因此123在2之前。

示例:

MDT 1
MDT 11
MDT 156
MDT 2
MDT 3
MDT 303
MDT 44

等等。

我正在使用此代码,但它似乎无效。

SELECT * FROM file ORDER BY ABS(ID) ASC

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

如果您的ID总是包含前缀为MDT,那么您可以使用它,根据您的要求进行排序:

SELECT * FROM File 
ORDER BY CAST(replace(ID, 'MDT ', '') AS UNSIGNED) ASC

SQLFiddle demo

答案 1 :(得分:1)

尝试这样,它将根据数字进行排序:

select substr(id,4)*1 from file order by substr(id,4)*1

它会给出

1
  2
  3
  11个
  44
 ...

如果您想要所有字段,请根据您的字符串长度尝试以下查询(“substr(id,4)”或“substr(id,5)”)(例如:id = proj- 001911 - >取SUBSTR(id,6)* 1))

select * from file order by substr(id,4)*1

答案 2 :(得分:0)

尝试该代码段

SELECT * FROM file ORDER BY ID + 0 ASC

答案 3 :(得分:0)

SELECT * FROM file
ORDER BY CONVERT(SUBSTRING(ID,5),UNSIGNED) ASC

SUBSTRING()会在'MDT '之后提取所有字符,而CONVERT()会将剩余的子字符串更改为执行ORDER BY的无符号整数

注意 SUBSTR()SUBSTRING()的同义词。

答案 4 :(得分:0)

我也在搜索它,但是就在阅读这里时,我被它打动了,发现了一个解决方案,如果该列只包含数字作为数据,那么您需要在数据库表中进行修改并定义该列作为INT值类型,那么我确定您需要完成。 例如。在这种情况下,Port是列中的{SELECT * FROM file ORDER BY CONVERT(SUBSTRING(ID,5),UNSIGNED) ASC},需要将其定义为Convert