2012-01-25 61 views
3

有没有办法在MySQL中的元素是这样排序:MySQL的顺序由字母 - 数字

元素:

  1. 市1
  2. 市2
  3. 市10
  4. 市1A

当我做的ORDER BY列表看起来这样:

  1. 市1个
  2. 市1A
  3. 市10
  4. 市2

因为所有的答案不匹配我的特殊问题,我编辑我的问题。 还有数字后面带有字符的元素。观看例子

+1

[数值顺序从MySQL返回结果时(可能重复http://stackoverflow.com/questions/3356190/numeric -order-when-returns-results-from-mysql) –

回答

3

我用这个和它工作得很好:

ORDER BY LENGTH(Elements), Elements 
+0

这只有在你的数据库包含“City XXXXX”形式的* only *元素时才有效。 –

+0

此解决方案的问题是,它不再按字母排序。如果数字出现在“a”,“b”之后,它也不起作用。 – StrongLucky

+0

正确,但在大多数情况下,我通常会面对这种情况,它功能强大且速度很快。现在在编辑问题中,我的答案是错误的,@Devart答案是正确的 – tommasop

0

你要提取由“城市”的数字部分和秩序。

SELECT city 
FROM ... 
ORDER BY (SUBSTRING(city,6)+0) 

这会从“城市”(从第6个字符开始)抓取数字并转换为字符串进行排序。

+0

如果城市名称长于或短于此示例,该怎么办? – dgw

+0

如同,城市名称因行而异?然后它有点困难。数字始终是字符串中的最后一个单词吗? (另外,如果有特殊情况需要这些,请更新您的问题,以便我们给出适当的答案)。 –

4

尝试这一招 - 'ORDER BY列名+ 1',例如:

SELECT * FROM element 
ORDER BY column_name+1; 
+0

只有当column_name中的值以数字开头时,才会出现这种情况。即如果你有'10a城市',这将起作用,但'城市10a'不会。在后一种情况下,您需要分割值中的空格并仅评估右半部分,从而确保在执行+0技巧之前处理数字开始值。 – JaredC

+0

是的,在这种情况下,字段值必须被解析,然后排序,这对性能不利。同意类型转换 - [当它捡起行时,它应该不会?](http://stackoverflow.com/questions/11773473/mysql-picking-row-when-it-shoudnt/11773592#11773592)。 – Devart