SQL:获取用户的第一名得分数

时间:2013-10-21 04:06:38

标签: php mysql

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

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 ;

我正在尝试根据他们拥有的第一名高分数量生成一份顶级球员名单。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

假设得分为1表示高分,则以下内容应符合您的要求:

SELECT count(user_id), user_id FROM game_scores WHERE score="1" GROUP BY user_id ORDER BY count(user_id) DESC