0

我有一张scores桌子:

id
user
score
date

现在,我可以轻松地选择前 10 名的高分

SELECT user, score, date FROM scores ORDER BY score DESC

但是,我只想为每个用户提供一个分数,即他的最高分。我会从类似的东西开始

SELECT user, MAX(score) AS score FROM scores GROUP BY user ORDER BY score DESC

但是,现在我已经失去了date记录的最高分。我如何得到它?

4

4 回答 4

1

你可以JOIN再次上桌:

SELECT s1.user, max(s1.dt), s2.mxscore as score
FROM scores s1
inner join 
(
    select user, max(score) mxscore
    from scores
    GROUP BY user 
) s2
    on s1.user = s2.user
    and s1.score = s2.mxscore
GROUP BY s1.username, s2.mxscore
ORDER BY score DESC

请参阅带有演示的 SQL Fiddle

于 2012-08-20T22:15:56.120 回答
1

事实上,你根本不需要 a GROUP BY

这是查询:

SELECT scores.id, scores.user, scores.score, scores.date
FROM scores
WHERE NOT EXISTS (
  SELECT * 
  FROM scores AS _scores
  WHERE _scores.user = scores.user
  AND (
    _scores.score > scores.score
    OR
    _scores.score = scores.score AND _scores.id < scores.id) 
)

SQL Fiddle看看它是否正常工作。

请注意,此查询正确处理用户多次获得最高分数的情况(它返回第一个最高分数的记录)。

于 2012-08-21T00:47:42.710 回答
0

您需要将结果与原始表格相关联:

select a.user, a.maxScore, b.maxDate
from (
    select user, max(score) as maxScore 
    from scores group by user ) as a
inner join (
    select user, score, max(date) as maxDate 
    from scores group by user, score) as b on a.user = b.user and a.maxScore=b.score
order by
    a.maxScore desc

此查询将返回每个用户的最高分数,以及获得该最高分数的最后日期(冗余,但为真)

于 2012-08-20T22:16:17.327 回答
0
SELECT   a.*
FROM     scores a
JOIN     (
         SELECT   MAX(a.id) AS id
         FROM     scores a
         JOIN     (
                  SELECT   user, MAX(score) AS score
                  FROM     scores
                  GROUP BY user
                  ) b ON a.user  = b.user
                     AND a.score = b.score
         GROUP BY a.user, 
                  a.score
         ) b ON a.id = b.id
ORDER BY a.score DESC

这将解决每个用户拥有多个相同最高分数的情况。在这种情况下,它将只取最大值id

于 2012-08-20T22:21:34.037 回答