为共享密钥选择具有最高版本的行

时间:2010-10-19 00:03:12

标签: sql mysql

这是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)无济于事。我应该放弃梦想并使用子查询吗?

1 个答案:

答案 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计划确定哪个表现最佳,而不是关心是否使用子查询。

相关问题