我创建了一个简单的游戏,我想为数据库中的每个类型获得最佳 lap_time 。
但是,我的查询返回错误的 player_id (第二行中为3)和 total_ranks (所有等级而非按类型计数)。
链接到sqlfiddle:http://sqlfiddle.com/#!9/a0c36a/2
期望的结果
+--------+-----+-------+------------+----------------+-------------+
| level | cp | type | player_id | MIN(lap_time) | total_ranks |
+--------+-----+-------+------------+----------------+-------------+
| 1 | 1 | 0 | 1 | 10.5 | 4 |
| 1 | 1 | 1 | 2 | 10.45 | 3 |
+--------+-----+-------+------------+----------------+-------------+
是否可以让它在1个查询中工作,还是至少需要2个?
答案 0 :(得分:2)
在MySQL中解决此问题的一种规范方法是使用子查询来确定每种类型的最小单圈时间。然后将您的全表加入此表以获取整个记录。请注意,这种方法的一个好的副作用是,如果给定类型有多个人共享最小单圈时间,我们也会收回关系。
SELECT r1.*, r2.total_ranks
FROM runtimes r1
INNER JOIN
(
SELECT type, MIN(lap_time) AS min_lap_time, COUNT(*) AS total_ranks
FROM runtimes
GROUP BY type
) r2
ON r1.type = r2.type AND
r1.lap_time = r2.min_lap_time
以下是您更新过的小提琴的链接:
答案 1 :(得分:2)
与Tim相同的概念,但使用Total_Ranks列
SELECT level, cp, R.type, player_id, MinTime, Total_Ranks
FROM runtimes R
JOIN (SELECT TYPE, MIN(LAP_TIME) MinTime, Count(*) Total_Ranks
FROM RUNTIMES
GROUP BY TYPE) T on R.Type = T.Type
and R.lap_time = T.MinTime
WHERE level=1
AND cp=1