1、业务背景

版本检查接口返回版本号排序时出现如下图所示问题

普通的查询按数字值逐级比较,导致版本号高的排在了后面,这样版本检查根据版本号排序倒排取出来的不是最新的版本号,本文就此问题查询了诸多方法,在此做个总结。

本文线上测试地址为:SQL Fiddle

本文用到的SQL函数的具体说明:MySQL 常用函数一览_SunshineGGB的博客-CSDN博客

模拟测试的表字段和数据如下

create table AppVersion
( VersionNumber varchar(25)); insert into AppVersion (VersionNumber) values
('1.1.0'),
('2.0.34'),
('2.0.38'),
('2.1.0'),
('3.5.6'),
('3.5.8'),
('3.5.13');

2、具体方法

正常查询版本号并按版本号倒序

SELECT VersionNumber
FROM AppVersion
ORDER BY VersionNumber DESC

结果如本文首图所示,会出现3.5.13排在3.5.8和3.5.6下方

1)方法一

通过使用CONCAT添加'0.0.0'来确保每一行至少有4个部分拼接成IP地址的形式,然后使用利用IP处理函数INET_ATON()返回一个代表该地址数值的整数进行排序即可。

【前提】:如果你知道版本号总是有3个分量,并且每个分量总是小于256,那么你可以使用以下方法

执行代码:

SELECT VersionNumber
FROM AppVersion
ORDER BY INET_ATON(CONCAT(VersionNumber, '.0')) DESC

效果如图:

本例代码测试链接地址:SQL Fiddle

2)方法二

同样是利用IP地址函数INET_ATON()和字符串拼接函数CONCAT()。同时使用SUBSTRING_INDEX来拉出前4个部分,使每一个部分看起来像一个IP,然后通过IP处理函数INET_ATON()返回对应的整数值进行比较排序。

执行代码:

SELECT VersionNumber
FROM AppVersion
ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(VersionNumber, '.0.0.0'), '.', 4)) DESC

效果如图:

本例代码测试链接地址:SQL Fiddle

3)方法三

获取版本范围:取每组版本号并向前补0至N位(比如5位、10位,下方代码为10位),最后拼接好再进行比较

执行代码:

SELECT VersionNumber
FROM AppVersion
ORDER BY CONCAT(
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 1), '.', -
1), 10, '0'),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 2), '.', -
1), 10, '0'),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 3), '.', -
1), 10, '0')
) DESC

效果如图:

本例代码测试链接地址:SQL Fiddle

4)方法四

获取版本顺序:如果只是排序,且版本号都是数字,可以采用每组版本号转数字(下方代码中的*1 、+0皆是转数字的小技巧),再进行排序

执行代码:

SELECT VersionNumber
FROM AppVersion
ORDER BY
SUBSTRING_INDEX(VersionNumber, '.', 1 )*1 DESC,
SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 2 ),'.',-1)*1 DESC,
SUBSTRING_INDEX(VersionNumber, '.', -1 )*1 DESC

效果如图:

本例代码测试链接地址:SQL Fiddle

类似,把*1改成+0一个意思

具体代码:

SELECT VersionNumber
FROM AppVersion
ORDER BY
SUBSTRING_INDEX(VersionNumber, '.', 1 )+0 DESC,
SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 2 ),'.',-1)+0 DESC,
SUBSTRING_INDEX(VersionNumber, '.', -1 )+0 DESC

本例代码测试链接地址:SQL Fiddle

5)方法五

版本号排序:思路是去掉小数点,右边补零防止错误填写,类型转换为数字然后再进行排序

执行代码:

SELECT
VersionNumber,
CONCAT(
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 1), '.', -
1), 3, '0'),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 2), '.', -
1), 3, '0'),
LPAD(CASE WHEN LENGTH(SUBSTRING_INDEX(VersionNumber, '.', 3)) =
LENGTH(SUBSTRING_INDEX(VersionNumber, '.', 2)) THEN '000'
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(VersionNumber, '.', 3),
'.', -1) END, 3, '0')
) AS VersionNumberSort
FROM
AppVersion
ORDER BY
VersionNumberSort DESC

效果如图:

6)方法六

通过拆分版本号并将每一部分排序为整数和字符串来获得同样的排序结果

执行代码:

SELECT
VersionNumber,
REPLACE(SUBSTRING(SUBSTRING_INDEX(VersionNumber, '.', 1), LENGTH(
SUBSTRING_INDEX(VersionNumber, '.', 1 - 1)) + 1), '.', '') v1,
REPLACE(SUBSTRING(SUBSTRING_INDEX(VersionNumber, '.', 2), LENGTH(
SUBSTRING_INDEX(VersionNumber, '.', 2 - 1)) + 1), '.', '') v2,
REPLACE(SUBSTRING(SUBSTRING_INDEX(VersionNumber, '.', 3), LENGTH(
SUBSTRING_INDEX(VersionNumber, '.', 3 - 1)) + 1), '.', '') v3,
REPLACE(SUBSTRING(SUBSTRING_INDEX(VersionNumber, '.', 4), LENGTH(
SUBSTRING_INDEX(VersionNumber, '.', 4 - 1)) + 1), '.', '') v4
FROM
AppVersion
ORDER BY
0 + v1 DESC, v1 DESC, 0 + v2 DESC, v2 DESC, 0 + v3 DESC, v3 DESC, 0 +
v4 DESC, v4 DESC;

效果如图:

以上就是MySQL 版本号排序的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

MySQL 版本号排序的更多相关文章

  1. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

  2. mysql 自定义排序顺序

    mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...

  3. CentOS6.x升级MySQL版本号5.1到5.6

    有一些虚拟机.云主机提供商仍然使用的是老版本号的安装套件. 预装的应用软件版本号非常低. 比方 techbrood.com 使用的云server,当中MySQL预装版本号为老版本号5.1.x. 而最新 ...

  4. Mysql 版本号、存储引擎、索引查询

    [1]Mysql 版本号.存储引擎.索引查询 # 查看数据库版本号 SELECT VERSION(); # 查看数据库支持的引擎(默认即Support == DEFAULT行) SHOW ENGINE ...

  5. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  6. MySQL分组排序(取第一或最后)

    MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...

  7. MySQL的排序(order by)

    MySQL的排序(order by) 1.降序(DESC) 2.升序(ASC) 1. 降序(DESC) 完整代码: SELECT `学号`,`考试日期`,`考试成绩` FROM `表2`ORDER B ...

  8. list中的对象或者map中的版本号排序 version排序

    经常会用到版本号排序,直接把他封装成一个工具用起来比较方便. List<A> aList = new ArrayList<>(); ...aList 赋值 ... Collec ...

  9. mysql order排序

    使用order by  可以对结果进行排序, 默认情况下,order by 以升序进行排序,因此ASC 子句是可选的. DESC 是降序排列. 升序 select * from emp where d ...

  10. mysql高级排序&高级匹配查询示例

    在大多数应用场景下,我们使用mysql进行查询时只会用到'=', '>' , '<' , in, like 等常用的方法,看起来,大多数情况下,已经足以应付我们的小型应用了.不过,在一些特 ...

随机推荐

  1. Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)

    软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...

  2. K8s集群环境搭建

    K8s集群环境搭建 1.环境规划 1.1 集群类型 Kubernetes集群大体上分为两类:一主多从和多主多从 一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适用于测 ...

  3. fbterm的配置,纯文本终端显示中文

    安装 fbterm sudo apt-get install fbterm 设置普通用户可以执行 fbterm 命令 sudo adduser username video #username为用户名 ...

  4. Clickhouse表引擎之MergeTree

    1.概述 在Clickhouse中有多种表引擎,不同的表引擎拥有不同的功能,它直接决定了数据如何读写.是否能够并发读写.是否支持索引.数据是否可备份等等.本篇博客笔者将为大家介绍Clickhouse中 ...

  5. Linux系统下安装tomcat步骤

    安装参考教程:https://www.cnblogs.com/li150dan/p/12535067.html 说明:jdk自动安装后路径是/usr/lib/jvm 在"vim /etc/p ...

  6. 动手实验查看MySQL索引的B+树的高度

    一:文中几个概念 h:统称索引的高度: h1:主键索引的高度: h2:辅助索引的高度: k:非叶子节点扇区个数. 二:索引结构 叶子节点其实是双向链表,而叶子节点内的行数据是单向链表,该图未体现. 磁 ...

  7. 使用selenium爬取淘宝

    一.出现的问题 前段时间在使用selenium对淘宝进行模拟登陆的时候,输入完正好和密码,然后验证码无论如何都不能划过去.找了好久,原来是因为selenium在浏览器中运        行的时候会暴露 ...

  8. VSCode解决Python中空格和制表符混用报错

    Python对缩进的要求非常严格,缩进控制不正确可能会造成代码执行不正确甚至报错. 遇到报错"TabError: inconsistent use of tabs and spaces in ...

  9. Prometheus高可用架构介绍

    Prometheus作为新生代的开源监控系统,慢慢成为了云原生体系的监控事实标准,也证明了其设计得到业界认可.但在多集群,大集群等场景下,Prometheus由于没有分片能力和多集群支持,还有Prom ...

  10. uniapp 微信小程序 引入 环信聊天

    最近项目需要实现一个聊天的功能,群聊或者单聊,用到环信,根据官网实现一下相关的配置吧 第一:下载环信demo  地址:https://github.com/easemob/webim-uniapp-d ...