MySQL ORDER BY的问题 - 我可以使用natsort来解决它吗?

时间:2010-02-01 00:05:53

标签: sql mysql natsort

我需要对MySQL结果使用自然排序,因为它当前按如下方式对我的INT值进行排序:

  • 1
  • 123
  • 1256
  • 22
  • 231

[等]

虽然我需要它像

那样排序
  • 1
  • 22
  • 231
  • 1256

我知道“natsort”函数,但它不适用于MySQL查询结果。我怎样才能(自然地)排序,是否可以在查询中执行此操作?

感谢您的帮助!

编辑:示例查询$result = mysql_query("SELECT * FROM forums ORDER BY 'posts' DESC;");

不完全确定我使用的DESC是否有效,但它不会抛出错误,所以它一定没问题。不幸的是,似乎将DESC改为ASC也没有效果......

3 个答案:

答案 0 :(得分:2)

您在那里发布的查询是按常量字符串表达式排序,而不是列名称或位置。要么使用反引号来引用,要么取出引号:

SELECT * FROM forums ORDER BY `posts` DESC

或者

SELECT * FROM forums ORDER BY posts DESC

可以解释为什么在ASC和DESC之间进行更改无效。

初步答案是:

您描述的排序顺序表明INT值实际上存储为字符类型(或者可能在排序之前转换为字符)。

检查您是以数字还是字符类型存储数据。如果可能,请使用数字类型,然后自然排序顺序将根据您的需要。如果您无法将基础数据类型更改为INT,那么您可以在查询中执行此操作(例如,使用CAST),可能会以性能为代价。

答案 1 :(得分:1)

如果帖子是非INT列,您可以尝试:

SELECT * FROM forums ORDER BY CAST(`posts` AS INT) DESC

另请查看http://drupal.org/project/natsort。这是一个Drupal模块,可用于促进MySQL排序。

答案 2 :(得分:0)

This question有一个我用过的MySQL的答案。