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



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

我尝试了这个查询:

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

你问的是每个玩家、每张地图的最小和最大时间 这是一个基本的选择,分组依据,需要 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

最新更新