Mysql 使用内部联接按最小值和最大值进行计数和分组

Mysql 使用内部联接按最小值和最大值进行计数和分组,mysql,join,group-by,inner-join,Mysql,Join,Group By,Inner Join,抱歉,如果标题令人困惑,我有一个表,其中存储了一个玩家以及他们在几秒钟内完成地图所用的时间,我正在尝试编写一个查询,选择特定玩家拥有的最快/最短时间的所有地图 我尝试了以下查询: SELECT * FROM ck_playertimes a JOIN ( SELECT MIN(runtimepro) runtimepro FROM ck_playertimes WHERE style = 0 group

抱歉,如果标题令人困惑,我有一个表,其中存储了一个玩家以及他们在几秒钟内完成地图所用的时间,我正在尝试编写一个查询,选择特定玩家拥有的最快/最短时间的所有地图

我尝试了以下查询:

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'
但是,它选择的某些时间不是特定地图的最短/最快时间,并且当表中不存在该重复时,甚至会以某种方式出现重复


有什么帮助吗?=)

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

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+或更高版本,那么编写上述查询的另一种更现代的方式是使用
行数

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;

你所要求的是每个玩家,每个地图的最小和最大时间 这是一个基本的选择和分组方式,需要bo连接

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

希望有帮助

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

表的结构是什么?大概,“runtimepro”是唯一的。嗨。这是一个常见问题。甚至还有一个标签:最伟大的每一组。强迫自己以多种方式清晰地写一个问题/问题/目标,有/没有特定的字符串/名称和谷歌。可能重复