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