1

假设我们有一个如下表

   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  

我想选择每个用户的历史最高分。

例如,如果玩家 john 在 2013 年 6 月 10 日打了 10 轮,那一天他的总分是 430。而在2013-06-14,他打了16轮,当天总分1220。我想为其他玩家显示用户 john 的最佳分数,依此类推。在上面的示例中,john 的最佳成绩是 2013-06-14,得分为 1220。

详细示例:如果用户 John 在 2013 年 6 月 10 日打了 3 局。第一轮44杆,第二轮38杆,第三轮55杆,当天总成绩137,第二天2013-06-11打了5轮,总成绩220。例如,他迄今为止的最佳总分是 220。所以它应该将每天的所有分数组合成一个总分。然后将此总数与其他天总数进行比较,并显示该用户的最高总数

提前致谢

4

2 回答 2

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

于 2013-04-18T07:58:50.487 回答
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)
于 2013-04-18T07:29:50.860 回答