MYSQL - 选择所有时间的高分

时间:2013-04-18 07:27:43

标签: php mysql group-by max

假设我们有一个如下表

   id   |   name   |  userid  |  score  |      datestamp      |
   ------------------------------------------------------------
    1   |   john   |    1     |   44    |  2013-06-10 14:25:55 
    2   |   mary   |    2     |   59    |  2013-06-10 09:25:51 
    3   |   john   |    1     |   38    |  2013-06-10 21:25:15 
    4   |   elvis  |    3     |   19    |  2013-06-10 07:25:18
    5   |   john   |    1     |   100   |  2013-06-14 07:25:18  

我想选择每个用户的所有时间得分。

所以例如,如果球员约翰在2013-06-10赛季打了十轮,他那天的得分总计为430。在2013-06-14赛季,他打了16轮比赛,那天他的得分为1220。我想显示用户john的最佳分数,以及其他玩家的等等。在上面的例子中,约翰斯的最佳得分是2013-06-14,得分为1220。

详细示例: 如果用户John在2013-06-10赛季打3轮。第一轮他得分44,第二次得分38,第三次得分55.他那天的总得分是137.而在2013-06-11的第二天,他打了5轮,总得分为220。例如,到目前为止他的最佳总分是220.所以它应该将每天的所有分数分组为总数。然后将此总数与其他天数进行比较,并显示该用户的最高总数

提前致谢

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

SELECT userId, name, MAX(score) as highScore
FROM (
    SELECT userID, name, SUM(score) as score, date(datestamp) as scoreDate
    FROM TableName
    GROUP BY userID, scoreDate
  ) dailyScores
GROUP BY userId

内部查询获取每个用户在每个日期的分数总和(时间戳转换为日期以删除时间信息),然后外部查询获得每个用户每个日期的最高总分。

我冒昧地基于J W的小提琴,我在你的示例数据中添加了另一行,所以功能很明显,请在这里试试: http://www.sqlfiddle.com/#!2/f6bea/3

答案 1 :(得分:0)

SELECT  a.*
FROM    Tablename a
        INNER JOIN
        (
            SELECT  userID, MAX(score) max_Score
            FROM    TableName
            GROUP   BY userID
        ) b ON a.userID = b.userID AND
                a.score = b.max_Score

为了加快搜索速度,您需要在(userid, score)上设置复合索引。以下是如何实现它:

ALTER TABLE TableName ADD INDEX (userid, score)