需要帮助在mysql中排序

时间:2013-05-04 06:27:31

标签: mysql sql-order-by

您好我想对表格进行排序。该字段包含数字,字母和带字母的数字,即

1
2
1a
11a
a
6a
b

我想对此进行排序,

1
1a
2
6a
11a
a
b

我的代码是,

SELECT * FROM t ORDER BY CAST(st AS SIGNED), st 
但结果是,

a
b
1
1a
2
6a
11a

我在此网址中找到了此代码

"http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/"
有人请帮助我

4 个答案:

答案 0 :(得分:5)

这将执行您所需的排序顺序,即使表中存在0;

SELECT * FROM t 
ORDER BY 
  st REGEXP '^[[:alpha:]].*', 
  st+0, 
  st

An SQLfiddle to test with

  • 作为第一个排序标准,它会在没有任何内容的情况下对任何以字母开头的内容进行排序。这就是正则表达式的作用。
  • 作为第二个排序标准,它按字符串开头的数值排序(st+0将0添加到字符串开头的数字部分并返回一个int)
  • 作为最后的手段,它按字符串本身排序,以按字母顺序排列。

答案 1 :(得分:2)

您可以使用:

SELECT *
FROM t
ORDER BY
  st+0=0, st+0, st

使用st+0 varchar列将被转换为int。按st+0=0排序会在底部放置字母数字行(如果字符串以字母数字字符开头,则st + 0 = 0将为1,oterwise将为0)

请参阅小提琴here

答案 2 :(得分:0)

您获得此输出的原因是所有字符如'a','b'等都会转换为'0',如果您使用ASC的订单,它将显示在顶部。

SELECT CAST(number AS SIGNED) from tbl

正在返回

1
2
1
11
0
6
0

看看这个小提琴: - SQL FIDDLE

答案 3 :(得分:-3)

我在您的查询中做了一些小改动 -

SELECT *, CAST(st AS SIGNED) as casted_column
FROM t
ORDER BY casted_column ASC, st ASC

这应该有效。 理论上你的语法应该有效,但不确定为什么mysql在tag之后不接受这些方法。 如此创建临时字段,然后对该字段进行排序。

这应该按照我的经验运作,你可以检查一下。

SQL FIDDLE