Mysql高阶自定义排序
Mysql高阶自定义排序
嗨,大家好,我是远码,隔三岔五给大家分享一点工作的技术总结,花费的时间不多,几分钟就行,谢谢!
Mysql对我们码农来说是在熟悉不过的日常了,就不在介绍它的基础用法了,今天我们来简单聊聊它的一个基本高阶使用。
一、问题引入
今天看到一个小伙伴在写一个表查询排序时,整的有点焦头烂额,大致逻辑是这样的:有一个学生表(主要表字段包括,主键:id,姓名:name,阶段:stage),其中stage的值包括(初中、高中、大学),需要按照用户的一下需求指定排序:初中、高总、大学,如果使用系统默认的排序,始终达不到要求,那该如果实现呢?
二、问题解决方式
咋一看,这不就是自定义排序嘛,借此机会就聊聊自定义排序的实现方式吧,大概有以下几种实现方式:
(一)FIELD函数实现
FIELD()函数返回值列表中值的索引位置,语法:FIELD(value, val1, val2, val3, ...),简单的说:改函数就是返回value在集合(val1,val2,val3,...)中对应的索引位置,结合上面的需求,是不是可以这样来使用,学生表stage值就映射函数的value,(初中、高总、大学)就映射函数的值列表集合,如果学生.stage=初中,返回值不是就是1;学生.stage=高中,返回值不是就是2;学生.stage=大学,返回值不是就是3,在对结果值排一个序,不就满足要求了嘛,话不多说上代码:
SELECT id,name,stage FROM `user` ORDER BY FIELD(stage,"初中","高中","大学") asc;
查询结果:搞定

(二)LOCATE函数实现
FIELD(substr,str,pos)函数返回字符串substr在str中第一次出现的位置,pos可空,表示开始坐标,例如:
SELECT LOCATE("初中","初中,高中,大学");--返回1
SELECT LOCATE("高中","初中,高中,大学");--返回2
SELECT LOCATE("大学","初中,高中,大学");--返回3
这不就正好满足上述需求嘛,话不多说上代码:
SELECT id,name,stage FROM `user` ORDER BY LOCATE(stage,"初中,高中,大学") asc;

(三)INSTR函数实现
INSTR(str,substr)函数返回字符串str中substr第一次出现的位置,例如:
SELECT INSTR("初中,高中,大学","初中");-- 返回1
SELECT INSTR("初中,高中,大学","高中");-- 返回2
SELECT INSTR("初中,高中,大学","大学");-- 返回3
这不就正好满足上述需求嘛,话不多说上代码:
SELECT id,name,stage FROM `user` ORDER BY INSTR("初中,高中,大学",stage) asc;

(四)CASE WHEN语句实现
CASE WHEN简单的说就是根据不同的条件将其转换为指定的值,比如:根据stage 的不同值转换为对应的数字,在对结果排序满足要求了,话不多说上代码:
SELECT id,name,stage FROM `user` ORDER BY CASE stage WHEN "初中" THEN 1 WHEN "高中" THEN 2 WHEN "大学" THEN 3 ELSE 4 END asc;

(五)数据表字典实现
数据表字典思路就是需要单独建立一个stage 的值映射对应关系表,最后通过关联查询,并对根据映射值排序,正好能够满足上述要求,话不多说上代码:
SELECT u.id,u.name,u.stage FROM `user` as u JOIN stage_dic as sd on u.stage = sd.stage ORDER BY sd.code asc;

三、问题总结
通过上面的5种排序,都能够解决问题引入提到的自定义排序需求。这5种排序,既有相同的应用场景,也有各自不同的应用场景,在实际使用中还需要根据实际情况选择不同的排序方式,下面对其做一个简单的总结:
- 针对简单枚举值皆可实现,数字表字典更灵活
- LOCATE与INSTR最终效果一致,参数颠倒,INSTR区分大小写,LOCATE不区分大小写
- 函数虽好,使用需要谨慎,能够在存储时就处理好数据,就不要在查询时通过函数计算来解
END
为了更高的交流,欢迎大家关注我的公众号,扫描下面二维码即可关注,谢谢:

Mysql高阶自定义排序的更多相关文章
- 高阶自定义View --- 粒子变幻、隧道散列、组合文字
高阶自定义View --- 粒子变幻.隧道散列.组合文字 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:h ...
- MySQL 数据库SQL语句——高阶版本1
MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...
- MySQL 数据库SQL语句——高阶版本2
MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...
- 高阶函数,柯里化,sort排序
高阶函数概念 first class object: 函数在python中时一等公民. 函数也是对象,可调用的对象. 函数可以作为普通变量,参数,返回值等等. 高阶函数: ...
- python高阶函数——sorted排序算法
python 内置的sorted()函数可以对一个list进行排序: >>> sorted([8,3,8,11,-2]) [-2, 3, 8, 8, 11] 既然说是高阶函数,那么它 ...
- MySQL使用order by field()自定义排序
MySQL的自定义排序和Oracle相比,要简单得多. 假设在表v_education的列schoolRecord中,有以下字段:'小学','初中','高中','专科','本科','硕士','博士'. ...
- mysql如何用order by 自定义排序
mysql如何用order by 自定义排序 id name roleId aaa bbb ccc ddd eee ,MySQL可以通过field()函数自定义排序,格式:field(value,st ...
- mysql查询区分大小写与自定义排序
mysql查询区分大小写: SELECT id,developer FROM products WHERE developer != '' and developer = binary('LYNN') ...
- mysql 自定义排序顺序
mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...
- MySQL自定义排序函数FIELD()
MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1.str2.str3.str4比较,返回1.2.3.4,如遇 ...
随机推荐
- 数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking、blending
数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking.blending 1.赛题简介 赛题以金融风控 ...
- 【Java】Eclipse常用快捷键整理
前言 还是最近在上Java课,由于疫情原因,看的网课,那里的老师比较实战派,很多时候不知道按了什么快捷键就立马出现了很骚的操作.网上查询后发现了一些快捷键对于我这个eclipse小白还是挺常用的,整理 ...
- linux 引导过程和服务控制
目录 一.引导分区 二.服务控制 三.运行级别 四.systemd初始化 五.模拟错误 一.引导分区 原理:引导分区是指在开机启动到进入系统这之间的过程 引导分区的过程:1.开机自检 自检顺序:BIO ...
- 深入理解 apply()方法
apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函数运行时使用的 this 值.请注意,this 可能不是该方法看到的实际值:如果这个函 ...
- From Java To Kotlin 2:Kotlin 类型系统与泛型
上期主要分享了 From Java To Kotlin 1 :空安全.扩展.函数.Lambda. 这是 From Java to Kotlin 第二期. From Java to Kotlin ...
- Gitlab恢复数据报错解决方法
背景 在Gitlab迁移恢复数据出现must be owner of extension plpgsql解决方法:在做gitlab迁移时,按正常Gitlab备份数据gitlab-rake gitlab ...
- 信创优选,国产开源,Solon v2.3.6 发布
Solon 是什么开源项目? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费 ...
- React后台管理系统11 配置项目初始化展开代码
在上一文中,我们已经配置好了,刷新默认打开选中的样式,但是如果是在/page3/1,这种的,并没有选中到/page3里面的/page3/1,这个地方来,所以我们需要解决的就是这几个问题: 思路如下: ...
- TornadoFx 页面之间的数据传递
原文地址: TornadoFx 页面之间的数据传递 - Stars-One的杂货小窝 和Android开发一样,经常遇到两个页面之间需要进行数据的交互传输,本文讲解下TornadoFx框架中,页面之间 ...
- Python web 框架对比:Flask vs Django
哈喽大家好,我是咸鱼 今天我们从几个方面来比较一些现在流行的两个 python web 框架--Flask 和 Django,突出它们的主要特性.优缺点和简单案例 到最后,大家将更好地了解哪个框架更适 ...