使用group by获取最大版本号问题记录

    技术2022-07-11  130

    一、背景描述

    最近有一个需求是数据库自动升级平台,每次升级,记录了数据库版本,新版本升级的时候需要找到当前数据库的最大版本,再进行升级。 表结构如下:

    CREATE TABLE `database_instance` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '数据库名称', `version` varchar(40) DEFAULT '0' COMMENT '版本号,格式:A.B.C', `versionHash` bigint(13) DEFAULT NULL COMMENT 'version转换成long类型hash值,便于查询最大版本。v1-占3位,v2-占5位,v3-占5位,总计13位数字表述版本的hash值', PRIMARY KEY (`id`), UNIQUE KEY `unique_key` (`name`,`version`), KEY `version_key` (`versionHash`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    数据记录如下:

    idnameverionversionHash1db01.0.010000000000002db11.0.010000000000003db01.0.110000000000014db11.0.21000000000002

    二、获取最大版本号记录遇到的问题

    第一版本:

    select id,name,version,max(versionHash) from database_instance group by name idnameverionversionHash1db01.0.010000000000012db11.0.01000000000002

    除了versionHash值,其他列都不对。为什么? 经过sql测试和调研,group by默认返回每一组的第一条数据(每一组的数据排序都是按默认顺序排序的);max在组内进行聚合运算。

    三、解决方案

    根据上面的调研,我们知道group by分组后,返回的是第一条记录的基本信息。 所以,我们先子查询order by,再外层用group by,就可以取得最大版本号对应的信息了。

    select id, name, version from ( select * from database_instance order by versionHash desc ) p group by p.name
    Processed: 0.010, SQL: 9