问题描述
业务上碰到个需求,要求展示的数据按照老板给定的部门顺序排序,这些部门的顺序无法通过原有的字段描述。
解决思路
一开始考虑的解决方法是数据库新增一个字段,根据权重进行排序。但是考虑到原有的业务逻辑,每个月每个部门都有新的数据汇总,如果新增字段的话,整个项目都要大改。
然后考虑过使用一个数据字典存储权重,在查询的时候做个多表连接排序,但是因为部门比较多,这个方法对性能影响比较大,所以放弃了。
为了在不影响原有功能的情况下实现这一功能,考虑从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,'香蕉部门,办事处,人资处,苹果部');
总结
这个方法不一定是最好的,但在综合考虑开发成本、对项目的影响、功能的使用频率来说,是比较适用于该场景的方案。
网友评论