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

f8rj6qna  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(296)

抱歉,如果标题混乱,我有一个表,其中存储了一个球员,以及他们花了多长时间完成Map秒,我试图写一个查询,选择所有Map,一个特定的球员有最快/最短的时间
我尝试了以下查询:

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'

然而,对于一个特定的Map,它会选择一些不是最短/最快的时间,并且当表中不存在该重复项时,甚至会有一个重复项
有什么帮助吗?=)

ggazkfy8

ggazkfy81#

你所要求的是最小和最大时间,对于每个玩家,对于每个Map,这是一个基本的选择与分组方式,与博加入需要
我假设您从中选择的表除了以秒为单位的时间外,还保存了一个player\u 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
hlswsv35

hlswsv352#

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

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;

相关问题