mysql使用内部联接选择顶级唯一值

时间:2012-09-17 09:13:21

标签: mysql select inner-join

我有两个看起来像这样的表:

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)。

非常感谢!

2 个答案:

答案 0 :(得分: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 Demo

答案 1 :(得分: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