最近在开发项目的时候有这么个需求,我数据库里面存了很多升级包,升级包有列数据表示的是升级包的版本号,类型属于字符串,结构类似于V1.0.2.22这种,然后后台有个任务需要获取最新版本号的那条数据。最开始的时候我不知道数据库居然对字符串类型的数据也可以筛选大小,之前一直觉得只有int型的数据才可以直接从数据库里面回去最大最小值。然后当我不知道的情况下,做法就很复杂了,把存储的所有版本号全部取出来,然后再按字符串的位进行逐一对比,最后筛选出最新也是版本号最大的版本,最后发现数据库直接就可以操作。
mysql查询方法果然神奇,居然可以给筛选出字符串的max的功能,只能说是牛逼!!!
方法如下:原生的mysql语句是这样的:
SELECT max(agent_ver) FROM versionpackage;
我用mysql workbench测试的截图如下:
如果是查询类型为int型的数据,直接把max括号里的key值改成类型为int的key值即可
我们后台开发用的是golang,mysql组件是gorm,先附上使用go代码查询最新版本号数据的主要代码
var maxVer string
dbmax := GormDbMysql.Table("versionpackage")
res := dbmax.Select("MAX(agent_ver)").Scan(&maxVer)
if res.Error != nil {return
}
db := GormDbMysql.Table("versionpackage")
res = db.Where("agent_ver = ?", maxVer).Find(&datastruct)
if res.Error != nil {return
}
代码很少,表达清楚就行了,简单解释一下,如果你只需要获取到最新版本号那个字符串,那么只需要前段代码即可,maxVer即是获取到的最新版本号;我项目中是需要获取最新版本号的整条数据,所以下面我又根据版本号获取了整条数据,本来是想一次访问获取最新版本号的最新数据的,奈何没有试成功,才又调用了一次,有可以一次就可以查询出版本号最新的整条的数据的,欢迎评论区指出,万分感激。
备注:
1、查询整条数据的时候代码里面没有定义datastruct结构体,这个根据不同的项目有所不同,此处省略了结构体,需要使用的同学需要在前面添加该结构体
2、还有就是如果数据库里面的版本号数据为空的时候,使用max查询最大值的时候会报错,不知道gorm插件后面是否会修复,我的处理方式是直接在前面再查询了表中的count数量,数量大于0的才执行下面的查询工作