MySQL字符串排序

题目描述

数据库有一列 name 数据如下
**楚乔传 第1集
楚乔传 第2集
...
楚乔传 第10集**

或者
楚乔传 02
楚乔传 02
...
楚乔传 11

如何按照大小习惯排序

题目来源及自己的思路

现在我自己做是自定义一个函数get_num_from_char提取连续的数字
然后order by get_num_from_char(name)
前辈们有什么更好的解决方法吗

相关代码

本来是想用一个单独的字段比如sort来自管理这个排序
但是用户是从一个媒体库导入的列表,不想手动处理

阅读 4k
4 个回答

就像你说的啊,写一个过滤函数 get_num_from_char(name) 返回一个序号,然后另存到一个字段
例如,一个很简单的思路就是:替换 一二三123,然后留下数字 0-9 就行了

XXX第1集 转成 1
XXXX-002集-HD 转成 002
第一季第003集,转成 1003
第二季第004集,转成 2004
第三季第005集.1080P,转成 30051080
第四季第006集-1080P,转成 40061080
大结局 之类的,特殊处理下,转成数字 99999999 之类的

把结果保存到一个 rank 字段,以后都用这个字段做 order by 排序
只要保证同一个系列的,名字格式类似,就行了

吐槽一句,sort 是动词,数据库字段,请用名词
另外,有看到说直接字符串排序的……只能说想象是美好的……
实际上会变成 1、10、11……2、20、21……3、30、31…… 这种

order by get_num_from_char(name)不建议这样写 因为会让name上的索引退化为全索引扫描
其实单独用一个字段来处理是比较好的方案。。

本来想着默认的排序也可以用,但是忽略了一些情况,感谢 @月之领主LM 的提醒

还是新增一个新的字段好,插入数据的时候自动把这个字段的值设为集数(程序自动处理),这样对于用户是透明的, 增加字段后无论是自动排序还是后期手动调整顺序都非常方便

建议加字段,插入数据的同时,代码处理一下,把集数抽取出来插到对应字段咯

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题