mysql实现按照自定义(指定顺序)排序

本文详细介绍了如何在MySQL中通过casewhen函数、field排序函数以及利用数据字典实现非标准顺序的排序,包括中国银行排序和正回购交易类型的定制排序方法,提高数据查询的灵活性和维护效率。
部署运行你感兴趣的模型镜像

mysql按照指定顺序排序(自定义排序)

一、mysql中实现指定排序需求

一般情况下,我们排序都是直接利用 order by 字段 asc/desc;但是如果要排序的字段数据格式并不能直接实现,或者说我们需要指定的顺序且没有什么规律,简单的order by字段就实现不了;
如下图中表;
在这里插入图片描述
我们需要按照中国银行,建设银行,工商银行顺序排序;直接使用order by 字段并不能得到我们想要的顺序
在这里插入图片描述
同样,对于类型我们想要按正回购,买入,卖出这样的顺序去排序,简单的order by 字段也不能实现;
在这里插入图片描述

二、解决方案

1:自定义排序实现

01. case when 转换实现自定义排序;

使用case when 将字段中的中国银行,建设银行,工商银行,转换为1,2,3,这样在我们再使用order by实现数据的自定义重排。
在这里插入图片描述

02:mysql排序函数filed 实现自定义排序(推荐);

MySQL中的field()函数,可以用来对SQL中查询结果集进行指定顺序排序。
field(str,str1,str2,str3…)字段str按照字符串str1,str2,str3…的顺序返回查询到的结果集。如果表中str字段值不存在于str1,str2,str3中的记录,放在结果集最前面返回。
在这里插入图片描述

03:函数locate 实现自定义排序;

还可以利用locate函数来实现排序;
locate(subStr,string) :判断字符串(string)中是否包含另一个字符串(subStr),函数返回的是subStr在string中出现的位置;
在这里插入图片描述

04:函数lnstr 实现自定义排序;

INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX);
同locate函数大致一样,不过函数内参数一个在前,一个在后;
在这里插入图片描述

05:利用数据字典实现自定义排序;

对于部分相对比较固定的字段,一般可以建立数据字典项来,不仅方便返回给前端做下拉等,也方便后期添加和修改的维护,也可以在数据字典中给与对应的顺序;主要可以方便后期调整和维护;只需要修改数据字典中的排序即可;
首先,需要在数据字典表中建立相应的数据字典项并维护顺序;
在这里插入图片描述
其次,存储时直接存储对应的数据字典值就可以了,然后关联查询,利用数据字典顺序排序;即可;
在这里插入图片描述
如果顺序有变,或者要添加新的类型,也只需要在数据字典中维护即可,不需要修改sql,扩展性较好(有需要甚至可以给与数据字典的配置页面专门维护);

在这里插入图片描述
在这里插入图片描述
仅作记录,方便后续查阅,如有错误还望

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

### MySQL 指定顺序排序实现方法 在 MySQL 中,可以通过 `FIELD` 函数或 `CASE WHEN` 语句来实现指定顺序自定义排序。以下是两种方法的具体实现方式: #### 方法一:使用 `FIELD` 函数 `FIELD` 函数允许用户为特定列值定义一个优先级列表,并按照该列表进行排序。例如,如果需要按照 `deal_status` 的值以 `1, 0, 2` 的顺序排序,则可以使用以下 SQL 语句[^1]: ```sql SELECT * FROM `task` ORDER BY FIELD(deal_status, 1, 0, 2); ``` 上述语句中,`FIELD(deal_status, 1, 0, 2)` 表示将 `deal_status` 的值按 `1, 0, 2` 的顺序排列。若需要倒序排列,则可以在 `FIELD` 函数后添加 `DESC` 关键字[^1]。 #### 方法二:使用 `CASE WHEN` 语句 `CASE WHEN` 语句可以更灵活地定义排序规则。例如,当 `type` 列的值为 `3` 时优先排在最前,其次为 `1`,其余情况按默认顺序排列,则可以使用以下 SQL 语句[^2]: ```sql SELECT * FROM `custom_sort` ORDER BY CASE WHEN type = 3 THEN 0 WHEN type = 1 THEN 1 ELSE 2 END; ``` 上述语句中,`CASE WHEN` 定义了三个条件分支,分别对应不同的优先级。通过这种方式,可以实现更加复杂的排序逻辑。 #### 综合应用 在某些场景下,可能需要结合 `FIELD` 和 `CASE WHEN` 来实现更复杂的排序需求。例如,当 `state = 1` 时按照 `create_time` 倒序排序,其他情况下按照 `push_time` 倒序排序,则可以使用以下 SQL 语句[^4]: ```sql SELECT * FROM `table` ORDER BY FIELD(state, 1) DESC, CASE WHEN state = 1 THEN create_time ELSE push_time END DESC; ``` 上述语句中,`FIELD(state, 1) DESC` 确保 `state = 1` 的记录优先显示,而 `CASE WHEN` 定义了不同状态下的具体排序逻辑[^4]。 ### 注意事项 - 如果需要对多个字段进行排序,可以在 `ORDER BY` 子句中依次列出字段名。 - 在使用 `CASE WHEN` 时,确保所有可能的情况都被覆盖,否则可能会导致未定义行为。 - 当数据量较大时,建议为排序字段创建索引以提高查询性能。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值