mysql 使用 order by 排序结果与预期不一致

问题

开发项目中有一张 scores 表用来保存学生的考试成绩,其中有一个 score 字段用来保存总分。业务中有对 score 字段进行排序的需求,但是 sql 语句执行后的结果与预期不一致,如下图所示:
排序结果与预期不一致
如上图所示,对 score 字段进行降序排序,预期结果应该是 102、101、87…… 而实际却不是。

原因

排序结果与预期不一致的原因在于 score 字段的类型是 varchar,而不是 int 或 double 等数字类型,所以 mysql 在使用 order by 排序时是按照字符串的形式来排序的。你可以从上图中看出来,它是按照 score 字段上的值的首位数字来排序的,所以 87 排在了最前面,而 101 排在了最后面。

解决方法

既然不是按照数值排序,而我们期望是按照数值排序,那解决方法也很简单,把 score 的类型改为数值就好啦。这里有两种修改类型的方法:一是重新设计表,将整张表的 score 字段类型改为整数或浮点数。二是在 sql 语句中将 score 的值转为数值。因为在实际业务中,score 不一定是数字,可以是 A、B、C 这种等级,这也是我们当初把 score 设计为字符串的原因,所以这里我只能采取第二种方法,在 sql 中使用 convert 方法进行类型强转换,如下图所示:
使用 convert 方法进行类型强转换
问题解决啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值