【问题标题】:COUNT and GROUP BY min and max using INNER Join使用 INNER Join 的 COUNT 和 GROUP BY min 和 max
【发布时间】:2019-03-21 03:44:15
【问题描述】:

对不起,如果标题令人困惑,我有一个表格存储玩家以及他们在几秒钟内完成地图所需的时间,我正在尝试编写一个查询来选择特定玩家最快的所有地图/最短时间

我试过这个查询:

SELECT * 
  FROM ck_playertimes a 
  JOIN 
     ( SELECT MIN(runtimepro) runtimepro 
         FROM ck_playertimes 
        WHERE style = 0 
        group 
           by mapname
     ) b 
    ON a.runtimepro = b.runtimepro 
 WHERE steamid = 'STEAM_1:0:20019070' 
   AND style = '0'

但是,它选择的某些时间对于特定地图来说不是最短/最快的,当表格中不存在重复项时,甚至会以某种方式出现重复项

有什么帮助吗? =)

【问题讨论】:

  • 表的结构是什么?
  • 大概,“runtimepro”是独一无二的。
  • 嗨。这是一个常见问题解答。甚至还有一个标签:每组最大 n。强迫自己以多种方式清楚地写出问题/问题/目标,有或没有你的特定字符串/名称和谷歌。

标签: mysql join group-by inner-join


【解决方案1】:

您加入的子查询应该找到每个玩家的最短运行时间。因此,以下应该有效:

SELECT c1.*
FROM ck_playertimes c1
INNER JOIN
(
    SELECT mapname, MIN(runtimepro) AS min_runtimepro
    FROM ck_playertimes
    GROUP BY mapname
) c2
    ON c1.mapname = c2.mapname AND c1.runtimepro = c2.min_runtimepro
WHERE
    c1.steamid = 'STEAM_1:0:20019070' AND
    c1.style = '0';

如果您使用的是 MySQL 8+ 或更高版本,则编写上述查询的另一种更现代的方式使用ROW_NUMBER

SELECT *       -- but always better to list out explicit columns
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY mapname ORDER BY runtimepro) rn
    FROM ck_playertimes
) t
WHERE rn = 1;

【讨论】:

    【解决方案2】:

    您要问的是每个玩家、每张地图的最短和最长时间 这是一个带有分组依据的基本选择,需要 bo 加入

    我假设您从中选择的表格除了以秒为单位的时间之外还包含一个 player_id 并保留您提供的 WHERE 条件

    希望对你有帮助

    SELECT  player_id, mapname, MIN(runtimepro) As shortest, 
    MAX(runtimepro) As longest
    FROM ck_playertimes times
    
    WHERE
    
    steamid = 'STEAM_1:0:20019070'
    AND style = '0'
    GROUP BY 
    player_id, mapname
    

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多