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,花了三天时间才算有所成就,发出来希望可以给大伙带来方便2010-07-07
分享mysql的current_timestamp小坑及解决
这篇文章主要介绍了mysql的current_timestamp小坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11
mysql ON DUPLICATE KEY UPDATE语句示例
本文介绍一下关于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法2013-11-11


最新评论