3

在我的数据库中,我有一个包含等级的名称列的表,例如 1.grade、2.grade 等等。当数字达到 10 或更多时,排序不会按我的意愿进行,因为 10.grade 在排序记录集中排在 2.grade 之前。我知道这是因为字符串排序不同于整数排序。问题是如何以数字方式对这些字符串进行排序。

因为成绩记录是使用 ancestry 插件构建的树的一部分,所以我必须将整个排序代码放入 :order => "(一些对结果进行排序的代码)" 中。

我试过了:order => "CAST(SUBSTRING_INDEX(name, '.') AS SIGNED)"。但这不起作用。

我在开发环境中使用 SQLite,在生产环境中使用 MySQL。

4

1 回答 1

3

尝试这个:

替换常数值'。用空字符串对你的列进行等级',然后你得到数值。将相同的内容转换为 int

order by cast(replace(name,'. grade','') as int)

编辑

根据您的评论,如果它始终不是“等级”,那么请尝试

order by cast(left(name,LOCATE('.',name,1)-1) as  UNSIGNED)


SQL小提琴演示

于 2012-10-08T08:30:23.187 回答