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

Mysql 是否可以使此查询正常工作?,mysql,sql,mariadb,Mysql,Sql,Mariadb,我正在创建一个简单的游戏,我想为数据库中的每个类型获得最佳圈速。 但是,我的查询返回了错误的玩家id(第二行中有3个)和总排名(所有排名,而不是按类型计数) 链接到sqlfiddle: 期望的结果 +--------+-----+-------+------------+----------------+-------------+ | level | cp | type | player_id | MIN(lap_time) | total_ranks | +--------+---

我正在创建一个简单的游戏,我想为数据库中的每个类型获得最佳圈速
但是,我的查询返回了错误的玩家id(第二行中有3个)和总排名(所有排名,而不是按类型计数)

链接到sqlfiddle:

期望的结果

+--------+-----+-------+------------+----------------+-------------+
| level  | cp  | type  | player_id  | MIN(lap_time)  | total_ranks |
+--------+-----+-------+------------+----------------+-------------+
|     1  |  1  |    0  |         1  |          10.5  |           4 |
|     1  |  1  |    1  |         2  |         10.45  |           3 |
+--------+-----+-------+------------+----------------+-------------+

在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
以下是您更新的小提琴的链接:


在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
以下是您更新的小提琴的链接:

与Tim的概念相同,但具有“总排名”列

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

与Tim的概念相同,但具有“总排名”列

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

玩家id(第二排3)是什么意思?@Noob请看SQLFiddle。OP真的应该把相关的代码和输出也放在问题本身中,想想你对player_id(第二行中的3)是什么意思?@Noob请看SQLFiddle。OP应该把相关的代码和输出也放在问题本身,虽然很好,但是你忘记了总的等级。很好,但是你忘记了总的等级。