Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL分组依据:获取“max”记录的值_Mysql_Sql_Group By - Fatal编程技术网

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) 
)