mysql中order by根据like查找关键字段设置权重排序的操作方法

 更新时间:2026年03月05日 09:16:49   作者:TTc_  
本文给大家介绍mysql中order by根据like查找关键字段设置权重排序的方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

1.存在的问题,应该将普通号排在前面

2.造成问题的原因

下面的Java代码中对YSXM做了拼接,sql是对KSID做的排序,比如数据库中YSXM的名称在普通号的前面的话,根据Java代码那么人名就会在前面后面普通号就被拼在了后面。

List<JSONObject> thisWeek = apiService.getListByApi(3258, param).getData();
            Map<String, List<JSONObject>> resultMap = new HashMap<>();
            //拼接医师内容
            HashMap<String, JSONObject> weekMap = new HashMap<>();
            for (JSONObject week : thisWeek) {
                String key = week.getString("KSID") + "|" + week.getString("RQ") + "|" + week.getString("BC");
                JSONObject js = weekMap.get(key);
                if (StringUtils.isNotEmpty(js)) {
                    //存在排班文档时
                    js.put("YSXM", js.getString("YSXM") +"、"+ week.getString("YSXM"));
                    js.put("YSDM", js.getString("YSDM") +"、"+ week.getString("YSDM"));
                    weekMap.put(key, js);
                }else {
                    //不存在时
                    weekMap.put(key, week);
                }
            }
sql:
SELECT MZGH_NYSPB.ID
     , MZGH_NYSPB.YSDM
     , MZGH_NYSPB.YSXM
     , MZGH_NYSPB.ZBDM
     , MZGH_NYSPB.KSID
     , MZGH_NYSPB.KSMC
     , MZGH_NYSPB.XQJ
     , MZGH_NYSPB.RQ
     , MZGH_NYSPB.BC
     , MZGH_NYSPB.YYXE
     , MZGH_NYSPB.YYRS
     , MZGH_NYSPB.ZT
     , MZGH_NYSPB.BZ
     , MZGH_NYSPB.XQ
FROM MZGH_NYSPB WHERE TO_DATE(MZGH_NYSPB.RQ, 'yyyy/MM/dd') >= TO_DATE('2026-3-1', 'yyyy/MM/dd')
  AND TO_DATE(MZGH_NYSPB.RQ, 'yyyy/MM/dd') <= TO_DATE('2026-3-7', 'yyyy/MM/dd')
  AND JGDM = 66 
 --and ysxm like  '田%'
 --and ID = '11482722026/03/06下午'
  ORDER BY KSID

如图所示:

3.修改后的sql:

SELECT MZGH_NYSPB.ID
     , MZGH_NYSPB.YSDM
     , MZGH_NYSPB.YSXM
     , MZGH_NYSPB.ZBDM
     , MZGH_NYSPB.KSID
     , MZGH_NYSPB.KSMC
     , MZGH_NYSPB.XQJ
     , MZGH_NYSPB.RQ
     , MZGH_NYSPB.BC
     , MZGH_NYSPB.YYXE
     , MZGH_NYSPB.YYRS
     , MZGH_NYSPB.ZT
     , MZGH_NYSPB.BZ
     , MZGH_NYSPB.XQ
FROM MZGH_NYSPB WHERE TO_DATE(MZGH_NYSPB.RQ, 'yyyy/MM/dd') >= TO_DATE('2026-3-1', 'yyyy/MM/dd')
  AND TO_DATE(MZGH_NYSPB.RQ, 'yyyy/MM/dd') <= TO_DATE('2026-3-7', 'yyyy/MM/dd')
  AND JGDM = 66 
  ORDER BY KSID,
         -- 关键修改:让普通号排在前面
         CASE 
           WHEN YSXM LIKE '普通号%' THEN 0  -- 普通号排在最前
           ELSE 1                            -- 其他排在后
         END,
         YSXM 

4.这段排序语句的含义解析:

CASE 
  WHEN YSXM LIKE '%普通号%' THEN 0  -- 普通号排在最前
  ELSE 1                            -- 其他排在后
END,
YSXM  -- 同类型内按姓名排序

1. 第一层排序:CASE WHEN表达式

  • 目的:创建一个临时排序权重
  • 逻辑
    • 如果 YSXM字段包含"普通号",返回权重值 0
    • 其他情况(如"田文君"等医生姓名),返回权重值 1
  • 效果ORDER BY会先按这个权重值排序,0在前,1在后,所以"普通号"会排在前面

2. 第二层排序:YSXM字段

  • 目的:在权重值相同的情况下,进行二级排序
  • 为什么要加这个
    • 当权重值相同时(比如有多个"普通号"记录,或多个非"普通号"记录),需要确定这些记录之间的顺序
    • 比如:如果有两个"普通号"记录,它们的权重值都是0,那么按字母顺序排序这两个"普通号"记录
    • 再比如:如果有"张三"和"李四"两个医生,它们的权重值都是1,那么按姓名排序这两个医生

3.实际排序效果示例

假设数据如下:

ID  | YSXM
----|---------
1   | 普通号
2   | 田文君
3   | 普通号
4   | 李医生
5   | 王医生

排序过程

  • 先按权重值排序(普通号=0,其他=1):
    • 权重0:普通号、普通号
    • 权重1:田文君、李医生、王医生
  • 在权重相同的组内,再按YSXM字母顺序排序:
    • 权重0组内排序:普通号、普通号(两者相同,按数据库默认顺序)
    • 权重1组内排序:李医生、田文君、王医生(按拼音/字母顺序)

最终排序结果

普通号
普通号
李医生
田文君
王医生

4.如果不需要二级排序,可以简化

如果只需要保证"普通号"在前面,同一类型内部的顺序无所谓,可以去掉最后的YSXM

ORDER BY KSID,
         CASE 
           WHEN YSXM LIKE '%普通号%' THEN 0
           ELSE 1
         END

这样会更快,但同一权重组内的记录顺序可能不确定。

改完后展示就正常了

到此这篇关于mysql中order by根据like查找关键字段设置权重排序的操作方法的文章就介绍到这了,更多相关mysql order by权重排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 远程无法连接Linux上MySQL的问题解决办法

    远程无法连接Linux上MySQL的问题解决办法

    MySQL不允许远程连接的问题通常可以通过配置用户权限、修改MySQL配置文件以及调整系统防火墙设置来解决,这篇文章主要介绍了远程无法连接Linux上MySQL的问题解决办法,需要的朋友可以参考下
    2025-09-09
  • MySQL多表查询与7种JOINS的实现举例

    MySQL多表查询与7种JOINS的实现举例

    最近学习了多表查询,对此做一些笔记的整理,下面这篇文章主要给大家介绍了关于MySQL多表查询与7种JOINS实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例的备份

    Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例的备份

    由于第一次接触LINUX,花了三天时间才算有所成就,发出来希望可以给大伙带来方便
    2010-07-07
  • Windows安装MySQL8.0时的报错汇总及解决方案

    Windows安装MySQL8.0时的报错汇总及解决方案

    据说安装MySQL是无数数据库初学者的噩梦,我在安装的时候也是查了很多资料,但是很多毕竟每个人的电脑有各自不同的情况,大家的报错也不尽相同,所以也是很长时间之后才安装成功,所以本文给大家汇总了Windows安装MySQL8.0时的报错解决方案,需要的朋友可以参考下
    2024-09-09
  • 浅谈MySQL8.0 异步复制的三种方式

    浅谈MySQL8.0 异步复制的三种方式

    这篇文章主要介绍了浅谈MySQL8.0 异步复制的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MySQL进阶之索引

    MySQL进阶之索引

    索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多,索引(index)是帮助MySQL高效获取数据的数据结构(有序),本文详细介绍了MySQL索引,感兴趣的同学可以参考阅读
    2023-04-04
  • 5分钟了解MySQL5.7中union all用法的黑科技

    5分钟了解MySQL5.7中union all用法的黑科技

    本文带领大家通过5分钟了解MySQL5.7中union all用法的黑科技,需要的朋友可以参考下
    2017-04-04
  • 分享mysql的current_timestamp小坑及解决

    分享mysql的current_timestamp小坑及解决

    这篇文章主要介绍了mysql的current_timestamp小坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • mysql ON DUPLICATE KEY UPDATE语句示例

    mysql ON DUPLICATE KEY UPDATE语句示例

    本文介绍一下关于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法
    2013-11-11
  • MySQL 数据类型详情

    MySQL 数据类型详情

    这篇文章主要介绍了MySQL 数据类型,数值类型分类又分严格数值类型和近似数值数据类型,下面文章围绕MySQL 数据类型展开内容,需要的朋友可以参考一下
    2021-11-11

最新评论