1

次のような2つのテーブルがあります。

users (uid, name)
-------------------
|  1  |  User 1   |
|  2  |  User 2   |
|  3  |  User 3   |
|  4  |  User 4   |
|  5  |  User 5   |
-------------------

highscores (user_id, time)
-------------------
|  3 |   12005    |
|  3 |   29505    |
|  3 |   17505    |
|  5 |   19505    |
-------------------

ハイスコ​​アを持つユーザーと、各ユーザーの最高のハイスコアのみを照会したいと考えています。結果は次のようになります。

------------------------
|  User 3 |   29505    |
|  User 5 |   19505    |
------------------------

私のクエリは次のようになります。

SELECT user.name, highscores.time
FROM user
INNER JOIN highscores ON user.uid = highscores.user_id
ORDER BY time ASC 
LIMIT 0 , 10

実際、これは同じユーザーの複数のハイスコアを返します。また、それらをグループ化しようとしましたが、最良の結果ではなくランダムな結果が返されたため、機能しませんでした (例: ユーザー ID 3 の場合、29505 ではなく 17505 が返されました)。

どうもありがとう!

4

2 に答える 2

2

MAX()とともに集約関数を使用する必要があります。group by

SELECT  a.name, MAX(b.`time`) maxTime
FROM    users a
        INNER JOIN highscores b
            on a.uid = b.user_id
GROUP BY a.name

SQLFiddle デモ

于 2012-09-17T09:15:12.770 に答える
1

ユーザーをグループ化するというあなたの努力は正しかった。MAX(time)のみを選択する代わりに、集計関数を使用する必要がありましたtime

あなたが書いた古いクエリは次のようなものだったと思います:

SELECT name, time 
FROM users 
INNER JOIN highscores ON users.uid = highscores.user_id 
GROUP BY name,time

しかし、実際のクエリは次のようになります。

SELECT user.name, MAX(`time`) AS topScore
FROM users 
INNER JOIN highscores ON users.uid = highscores.user_id
GROUP BY user.name
于 2012-09-17T09:26:10.557 に答える