Php MYSQL-选择所有时间高分

Php MYSQL-选择所有时间高分,php,mysql,group-by,max,Php,Mysql,Group By,Max,假设我们有一张像下面这样的桌子 id | name | userid | score | datestamp | ------------------------------------------------------------ 1 | john | 1 | 44 | 2013-06-10 14:25:55 2 | mary | 2 | 59 |

假设我们有一张像下面这样的桌子

   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打了10场比赛,他当天的总得分是430。2013年6月14日,他打了16轮,当天的总成绩是1220分。我想为其他玩家显示用户john的最佳分数,以此类推。在上面的例子中,约翰的最佳得分为2013-06-14,得分为1220

详细示例: 如果用户John在2013-06-10玩了3轮。第一轮他得了44分,第二轮他得了38分,第三轮他得了55分。他那天的总分是137分。第二天2013-06-11,他打了5轮,总分220分。在这个例子中,他迄今为止最好的总分是220分。因此,它应该将每天的所有分数归为一个总数。然后将此总数与其他天数总数进行比较,并显示该用户的最高总数

提前谢谢

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)

这应该可以做到:

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的小提琴为基础,在示例数据中添加了另一行,因此功能很明显,请在此处尝试:

当MySQL数据库中有很多用户时,您的查询速度会非常慢。@Aron怎么做?你测试过了吗?实际上你刚刚看过你的SQLFiddler演示。它的工作原理是将内部子查询创建为临时表,因此速度很慢。@Aron这是因为它没有定义键。试试这个,然后阅读执行:有趣……一般来说,我发现MySQL的子查询性能非常差。它什么时候实际使用索引,什么时候实际创建临时表?也许我遗漏了什么,但在你的例子中,john在2013-04-14的最好成绩不是100分吗?你是从哪里得到1220的?@gordonk-他想按每个邮戳分组得分。并且给定的示例不包含所有记录。@hims056这是正确的。因此,等等,您不想要“所有时间的高分”,而是每个用户的“每日高分总和”?您最好在表中包含一个额外的
日期
列,通过复合索引和
userid
。在外部查询中选择的
scoreDate
将是不确定的。噢,是的,谢谢你指出这一点!我已经把它拿出来了,但他似乎不想在他的结果中看到它@德雷尼:这个问题有帮助吗?