假设我们有一个如下表
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.所以它应该将每天的所有分数分组为总数。然后将此总数与其他天数进行比较,并显示该用户的最高总数
提前致谢
答案 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)