我有一个测验结果表。用户可以为每个类别反复使用它 - 我需要每个类别的最高分和相应的时间戳。
所以我真的很接近,但是时间戳字段正在杀死我。
这是一个用户数据:(“得分”是varchar和%s - 这就是我的手。也按类别排序,然后是最高分,然后是时间戳。如果我可以为每个类别选择第一行我是完成的。)
catid score timestamp
5 100% 2012-03-22 19:26:41
6 88.89% 2012-06-12 15:20:41
6 77.78% 2012-06-12 15:17:58
7 100% 2012-06-12 16:08:35
7 100% 2012-06-12 16:03:35
7 53.33% 2012-06-12 15:59:44
8 88.89% 2012-06-12 16:13:00
9 83.33% 2012-06-12 16:22:19
10 100% 2012-06-12 17:55:50
10 76.47% 2012-06-12 17:51:54
11 100% 2012-06-12 18:07:12
11 66.67% 2012-06-12 18:05:35
这就是我需要的:
catid score timestamp
5 100% 2012-03-22 19:26:41
6 88.89% 2012-06-12 15:20:41
7 100% 2012-06-12 16:08:35
8 88.89% 2012-06-12 16:13:00
9 83.33% 2012-06-12 16:22:19
10 100% 2012-06-12 17:55:50
11 100% 2012-06-12 18:07:12
这是我正在使用的MySQL:
SELECT catid
, MAX(0 + score)
, `timestamp`
FROM `results`
WHERE userid = 100
GROUP BY catid
ORDER BY catid ASC
, (0 + score) DESC
, timestamp DESC
;
它正在制作的表格:
5 100 2012-03-22 19:26:41
6 88.89 2012-06-12 15:17:58
7 100 2012-06-12 15:59:44
8 88.89 2012-06-12 16:13:00
9 83.33 2012-06-12 16:22:19
10 100 2012-06-12 17:51:54
11 100 2012-06-12 18:05:35
如此接近 - 但时间戳不是与最高值相关联的时间戳。发生了什么,我该如何解决?
谢谢!
答案 0 :(得分:2)
如果您使用数字类型来存储百分比而不是字符串,那么您的表格将会高出328倍。但是,对于这个答案,我会忽略这个问题,尽管你真的应该尽快解决它。
您可以按如下方式解决问题:
SELECT catid, score, MAX(timestamp) AS timestamp
FROM results
WHERE userid = 100
AND (catid, CAST(score AS DECIMAL(5,2))) IN
(
SELECT catid, MAX(CAST(score AS DECIMAL(5,2))) AS score
FROM results
WHERE userid = 100
GROUP BY catid
)
GROUP BY catid
查看在线工作:sqlfiddle
或将日期时间格式化为字符串:sqlfiddle
<强>结果
CATID SCORE TIMESTAMP 5 100% 2012-03-22 19:26:41 6 88.89% 2012-06-12 15:20:41 7 100% 2012-06-12 16:08:35 8 88.89% 2012-06-12 16:13:00 9 83.33% 2012-06-12 16:22:19 10 100% 2012-06-12 17:55:50 11 100% 2012-06-12 18:07:12
答案 1 :(得分:0)
SELECT MAX(score), catid, timestamp FROM db.table GROUP BY catid ORDER BY score DESC;