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,它返回 17505 而不是 29505)。

非常感谢!

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 回答