3

ビデオゲームのハイスコアボードを作成しようとしています。

users次の表があります。

ここに画像の説明を入力

そしてscoresテーブル:

ここに画像の説明を入力

私はこのクエリを使用してみました:

SELECT MAX(`scores`.`score`) AS max_score,
    `scores`.`team`,
    `users`.`name`
FROM `scores`
    LEFT JOIN `users`
    ON `users`.`id` = `scores`.`user_id`
GROUP BY `scores`.`user_id`
ORDER BY max_score DESC
LIMIT 50

この結果を返します (サンプル):

ここに画像の説明を入力

ご覧のとおり、ユーザーFUNTIMESの のスコアは、表によると に帰する必要が210あるときに に帰されています (のスコアは 11)。eaglesvikingsscoresFUNTIMESuser_id

これを修正するにはどうすればよいですか?このようなものは美しく機能します:

SELECT `scores`.`score`, `scores`.`team`, `users`.`name`
FROM `scores`
LEFT JOIN `users`
ON `users`.`id` = `scores`.`user_id`
WHERE `scores`.`id` IN (
    SELECT MAX(`scores`.`score`)
    FROM `scores`
    GROUP BY `scores`.`user_id`
)
ORDER BY `scores`.`score` DESC
LIMIT 50

しかし、もちろん、 WHERE idis INを選択することはできませんscore。私は完全に迷っています。

助けてくれてありがとう。

編集: 申し訳ありませんが、言及するのを忘れていました: 各ユーザーは、ハイスコア テーブルに一度しか表示できません。user_id(これが、クエリにGROUP BY 規定がある理由です。)

4

3 に答える 3

3

SQL フィドル

MySQL 5.5.32 スキーマのセットアップ:

CREATE TABLE users 
    (`id` int, `name` varchar(8), `pass` varchar(4))
;

INSERT INTO users 
    (`id`, `name`, `pass`)
VALUES
    (2, 'JAKE', 'jake'),
    (3, NULL, NULL),
    (4, 'AWNO', 'ffff'),
    (5, 'FFF', 'ffff'),
    (6, 'ASDF', 'asdf'),
    (7, 'KKK', 'kkkk'),
    (8, 'AW YEAH', 'good'),
    (9, 'FFFF', 'ffff'),
    (10, 'FUNTIME', 'llll'),
    (11, 'FUNTIMES', 'llll'),
    (12, 'GOOD', 'good')
;

CREATE TABLE scores
    (`id` int, `user_id` int, `team` varchar(7), `score` int)
;

INSERT INTO scores
    (`id`, `user_id`, `team`, `score`)
VALUES
    (32, 9, 'vikings', 610),
    (33, 10, 'eagles', 290),
    (34, 11, 'eagles', 0),
    (35, 11, 'vikings', 40),
    (36, 11, 'vikings', 210),
    (37, 12, 'eagles', 170),
    (38, 12, 'eagles', 30)
;

クエリ 1 :

SELECT m.`max_score`,
    s.`team`,
    u.`name`
FROM `scores` s
    LEFT JOIN `users` u
    ON u.`id` = s.`user_id`
INNER JOIN (SELECT `user_id`, MAX(`score`) as max_score 
            FROM `scores` 
            GROUP BY `user_id`) m ON m.`user_id` = s.`user_id` AND
                                     m.`max_score` = s.`score`
ORDER BY max_score DESC
LIMIT 50

結果

| MAX_SCORE |    TEAM |     NAME |
|-----------|---------|----------|
|       610 | vikings |     FFFF |
|       290 |  eagles |  FUNTIME |
|       210 | vikings | FUNTIMES |
|       170 |  eagles |     GOOD |

ディスカッションの目的:

クエリ 1 :

SELECT `user_id`, MAX(`score`) as max_score 
            FROM `scores` 
            GROUP BY `user_id`

結果

| USER_ID | MAX_SCORE |
|---------|-----------|
|       9 |       610 |
|      10 |       290 |
|      11 |       210 |
|      12 |       170 |
于 2013-10-04T18:09:51.243 に答える