这是mysql中的Schema:
CREATE TABLE IF NOT EXISTS `labs_test`.`games` (
`game_id` INT NOT NULL AUTO_INCREMENT ,
`key` VARCHAR(45) NOT NULL ,
`config` BLOB NOT NULL ,
`game_version` BIGINT NOT NULL DEFAULT 1 ,
PRIMARY KEY (`game_id`) ,
INDEX `key` (`key`(8) ASC) ,
INDEX `version` (`game_version` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
我尝试过使用MAX(game_version)无济于事。我应该放弃梦想并使用子查询吗?
答案 0 :(得分:1)
使用:
SELECT g.*
FROM GAMES g
JOIN (SELECT t.key,
MAX(t.game_version) AS max_version
FROM GAMES t
GROUP BY t.key) x ON x.key = g.key
AND x.max_version = g.game_version
有些人会将我在答案中使用的内容称为子查询,但将其称为派生表/内联视图会更准确。除非我遗漏了什么,否则我看不出如何在没有某种形式的自我加入的情况下获得记录(将同一个表连接到自身)。这是EXISTS替代方案:
SELECT g.*
FROM GAMES g
WHERE EXISTS(SELECT NULL
FROM GAMES t
WHERE t.key = g.key
GROUP BY t.key
HAVING MAX(t.game_version) = g.game_verion
使用EXPLAIN计划确定哪个表现最佳,而不是关心是否使用子查询。