我有一个存储测试结果的表:
user | score | time -----+-------+------ aaa | 90% | 10:30 bbb | 50% | 9:15 *** aaa | 85% | 10:15 aaa | 90% | 11:00 *** ...
我需要的是获得前10名用户:
user | score | time -----+-------+------ aaa | 90% | 11:00 bbb | 50% | 9:15 ...
我想出了以下SELECT
:
SELECT * FROM (SELECT user, score, time
FROM tests_score
ORDER BY user, score DESC, time DESC) t1
GROUP BY user
ORDER BY score DESC, time
LIMIT 10
它工作正常但我不太确定我使用ORDER BY
是否是选择每组已排序记录的第一行的正确方法。有没有更好的做法来达到同样的结果? (我使用MySQL 5)
答案 0 :(得分:2)
确保获得最高分的另一种解决方案可能是
SELECT t1.*
FROM tests_score t1
JOIN (SELECT user, MAX(score)
FROM test_score
GROUP BY user) as t2 ON t1.user = t2.user
AND t1.score = t2.score
答案 1 :(得分:1)
好像你想要得分最新的时间。
此查询获取每个用户的最新分数,并按分数对其进行排序。
SELECT user, MAX(score), time
FROM test_results tr
LEFT OUTER JOIN test_results tr2
ON tr2.user = tr.user AND tr2.time > tr.time
WHERE tr2.user IS NULL
GROUP BY user
ORDER BY MAX(score) DESC, time
如果同一用户同时发布两个分数,则使用较大的分数。仅当分数是整数列而不是字符串列时才有效,因为5%按字母顺序排在60%之前。