场景1
班级排序,如七年级1班、七年级2班、八年级1班、八年级3班、八年级6班等,这里需要对六、七、八、九诸如此类进行一个排序,表结构如下
这里采用的方法是把这一列的第一个字符取出来,然后自定义返回规则去进行排序
field函数的使用
field(str,str1,str2,str3,str4…)
字段str按照字符串1、字符串2、字符串3、字符串4的顺序返回查询到的结果集。如果表字段值str不存在,放在结果集的最前面
substring函数
如七年级1班,想要截取第一个字符,就是substring(user_name,1,1),第一个参数写字段,第二个参数写从哪开始起始是1,第三个参数写需要截取的字符个数
完整sql
select user_name as class
from mall_user
order by field(SUBSTRING(user_name,1,1),'七','八','九')
查询结果如下
这里遗留一个问题,就是数字+班也自动排序了,为什么不需要自己添加排序字段,后面要来探讨补充
场景2
字段中有数字和汉字,这里要求先排序数字但是要有序,然后再排序汉字,汉字按照首拼音那种方式使其有序
表结构如下
convert函数
mysql一般无法处理汉字排序问题,碰见诸如此类,使用convert函数将查询到的字段转为gbk即可排序
以下均为固定写法,用其作为排序条件则汉字就可按首拼音排序
convert(‘字段名’ using gbk)
convert的第二种用法,可以将字符串转为数值型
convert (字段名, type);
type有三种,decimal浮点数,signed整数,unsigned无符号整数
判断字段值是数字or汉字的一种方式
添加限定条件:(字段名+0)>0 汉字为0 数字为1
一般是直接添加一列作为一个tag用来标记,更好的使用
完整sql
select user_name,(user_name+0)>0 as flag
from mall_user
order by flag desc,(user_name+0),CONVERT(user_name using gbk)
排序结果如下,处理的思想可以了解
场景3
师傅的业务代码中存在正则表达式匹配相关知识,补充知识如下