美文网首页
MySql--根据指定字符串顺序排序

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

作者: CaesarH000 | 来源:发表于2022-11-07 15:04 被阅读0次

    问题描述

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

    解决思路

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

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

    为了在不影响原有功能的情况下实现这一功能,考虑从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,'香蕉部门,办事处,人资处,苹果部');
    

    总结

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

    相关文章

      网友评论

          本文标题:MySql--根据指定字符串顺序排序

          本文链接:https://www.haomeiwen.com/subject/lmmwtdtx.html