我有两个看起来像这样的表:
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)。
非常感谢!
答案 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
答案 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