MySql--根据指定字符串顺序排序

问题描述

业务上碰到个需求,要求展示的数据按照老板给定的部门顺序排序,这些部门的顺序无法通过原有的字段描述。

解决思路

一开始考虑的解决方法是数据库新增一个字段,根据权重进行排序。但是考虑到原有的业务逻辑,每个月每个部门都有新的数据汇总,如果新增字段的话,整个项目都要大改。

然后考虑过使用一个数据字典存储权重,在查询的时候做个多表连接排序,但是因为部门比较多,这个方法对性能影响比较大,所以放弃了。

为了在不影响原有功能的情况下实现这一功能,考虑从sql入手,仅在展示页面(findAll)时对部门进行排序,使用order by 关键字。找到一个mysql函数——field(str,str1,str2,str3,str4……),感兴趣的同学可以自己看一下,这是个按照str1,str2,str3,str4……的顺序返回str查询到的结果集的函数,如果表中str字段值不存在于str1,str2,str3,str4中的记录,放在结果集最前面返回。

根据这个启发,选择了使用find_in_set(str,strList)函数,find_in_set可以返回str在strList中的位置,如果str不在strList中,则返回0,这样一来,只要将需要排序的sql后加上order by find_in_set(name,list),就可以实现排序,并且对整个项目的其他功能是没有影响的。后期通过对list的维护,实现排序顺序的变动。

实践

建表语句

CREATE TABLE `t_test` (
  `id` varchar(40) comment '主键id',
  `strName` varchar(100) NOT NULL comment '部门名',
  `remark` varchar(100) NOT NULL comment '备注',
  `cost` int(11) NOT NULL comment '成本',
  PRIMARY KEY (`id`) USING BTREE
)

测试数据

insert into `t_test` values(UUID(),'技术部',null,12);
insert into `t_test` values(UUID(),'销售部',null,1);
insert into `t_test` values(UUID(),'人资处',null,132);
insert into `t_test` values(UUID(),'办事处',null,123);
insert into `t_test` values(UUID(),'苹果部',null,233);
insert into `t_test` values(UUID(),'香蕉部门',null,120);

要求按照:香蕉部门、办事处、人资处、苹果部,的顺序展示信息,不存在的部门放在最后
解决方案

select * from t_test
order by find_in_set(strName,'香蕉部门,办事处,人资处,苹果部');

总结

这个方法不一定是最好的,但在综合考虑开发成本、对项目的影响、功能的使用频率来说,是比较适用于该场景的方案。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DB version: 5.7.25-log 目录: 一、字符串常规函数 二、字符串比较函数 三、正则表达式 四、...
    左轮Lee阅读 523评论 0 1
  • ASCII(str) 返回字符串 str 中最左边字符的 ASCII 代码值。如果该字符串为空字符串,则返回0。如...
    JavaEdge阅读 485评论 0 1
  • Author:杜七 Date:2017.03.15 字符串截取 MySQL 字符串截取函数:left(), rig...
    杜七阅读 652评论 0 2
  • CONCAT() 将多个字符串连接成一个字符串,如有任何一个参数为NULL,则返回值为NULL注意如果自变量中含有...
    若兮缘阅读 2,362评论 0 10
  • 一、set集合【了解】 1.概述 和数学上的集合基本是一样的,特点:不允许有重复元素,可以进行交集,并集,差集的运...
    墨雨love薏雪阅读 697评论 0 0