1

我有一个具有以下结构的分数表:

CREATE TABLE IF NOT EXISTS `game_scores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `game_id` int(11) NOT NULL,
  `score` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=329 ;

我正在尝试生成按他们拥有的第一名高分数量排序的顶级玩家列表。

4

2 回答 2

1

假设:

  • 分数越高越好。(否则,使用MIN代替MAX
  • 这里的问题是有多个游戏,用 表示game_id。因此,每个人都game_id应该有自己的第一名用户

您可以通过以下方式获得第一名:

SELECT MAX(score) score, game_id
FROM game_scores
GROUP BY game_id

然后,您可以通过加入此聚合来获得得分第一的用户。这也应该适当地包括关系:

SELECT s.user_id
FROM game_scores s
INNER JOIN (
    SELECT MAX(score) score, game_id
    FROM game_scores
    GROUP BY game_id
) fp ON s.game_id = fp.game_id AND s.score = fp.score

然后,您可以为每个用户计算这些并按计数排序:

SELECT s.user_id, COUNT(*) first_place_scores
FROM game_scores s
INNER JOIN (
    SELECT MAX(score) score, game_id
    FROM game_scores
    GROUP BY game_id
) fp ON s.game_id = fp.game_id AND s.score = fp.score
GROUP BY s.user_id
ORDER BY COUNT(*) DESC
于 2013-10-21T04:12:40.983 回答
0

假设分数为 1 表示高分,以下应该做你想要的:

SELECT count(user_id), user_id FROM game_scores WHERE score="1" GROUP BY user_id ORDER BY count(user_id) DESC
于 2013-10-21T04:11:56.320 回答