2017-08-17 50 views
0

我正在创建一个简单的游戏,我想获得最好的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

你是什么意思与player_id(第二行3)? – Noob

+1

@Noob看到SQLFiddle。 OP应该真的把相关的代码和输出在问题本身,虽然 – ADyson

回答

2

Fiddle

相同的概念作为添,但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 
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

+0

不错,但你忘了total_ranks。 – exexe