我有一个具有以下结构的分数表:
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 ;
我正在尝试根据他们拥有的第一名高分数量生成一份顶级球员名单。
答案 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