是否可以使此查询正常工作?

时间:2017-08-17 14:58:08

标签: mysql sql mariadb

我创建了一个简单的游戏,我想为数据库中的每个类型获得最佳 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个?

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

以下是您更新过的小提琴的链接:

SQLFiddle

答案 1 :(得分:2)

Fiddle

与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