MySQL / PHP:返回包含MAX值的行值

时间:2012-07-12 22:54:34

标签: php mysql

我有一个测验结果表。用户可以为每个类别反复使用它 - 我需要每个类别的最高分和相应的时间戳。

所以我真的很接近,但是时间戳字段正在杀死我。

这是一个用户数据:(“得分”是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

如此接近 - 但时间戳不是与最高值相关联的时间戳。发生了什么,我该如何解决?

谢谢!

2 个答案:

答案 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;