Mysql SQL分组依据:获取“max”记录的值
我有一个分数表: 现在,我可以很容易地用Mysql SQL分组依据:获取“max”记录的值,mysql,sql,group-by,Mysql,Sql,Group By,我有一个分数表: 现在,我可以很容易地用 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 然而,现在我已经失去了记录最高分数的日期。如何获得它?您可以再次加入到表中: SELECT s1.user,
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
然而,现在我已经失去了记录最高分数的日期。如何获得它?您可以再次加入到表中:
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
请参见您需要将结果与原始表格相关联:
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
此查询将返回每个用户的最高分数,以及该最高分数被打分的最后日期,但为true
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。事实上,您根本不需要一个GroupBy
问题是:
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)
)
并看到它的工作
请注意,此查询正确地处理了用户多次获得最大分数的情况,它返回了第一个最大分数的记录。如果有多个日期具有相同的分数,会发生什么情况?id字段不太可能是用户id,而是一个自动递增的字段,作为每个分数实例的主键。
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)
)