GROUP BY作为从一组相似行中选择第一行的一种方式,这是正确的,还有其他选择吗?

时间:2010-04-05 15:49:05

标签: sql mysql select

我有一个存储测试结果的表:

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)

2 个答案:

答案 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%之前。