2013-10-21 41 views
1

的第一名成績的數我有一個具有以下stucture得分表:SQL:獲取用戶

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 ; 

我想產生的頂尖選手由第一名高分數量排序列表他們有。

回答

1

假設:

  • 分數越高越好。 (否則,使用MIN代替MAX
  • 這裏的問題是有多個遊戲,用game_id表示。因此,每個game_id應該有自己的第一名用戶(S)

你可以通過第一名成績:

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 
+0

謝謝你的解釋,真的幫我理解這一點。被卡住了一段時間! – smcgovern

+0

當然可以。很多時候,複雜的SQL查詢都是從小部分構建而成的。它有助於從小處着手,並在此基礎上進行構建,直到你得到你想要的。 –

+0

@lc。給出完美的解釋而不僅僅是發佈答案 –

0

假設1分意味着高分數,下面應該做你想要什麼:

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