COUNT и GROUP BY min и max, используя INNER Join - PullRequest
0 голосов
/ 16 октября 2018

Извините, если заголовок сбивает с толку, у меня есть таблица, в которой хранится игрок, и сколько времени им потребовалось, чтобы заполнить карту в секундах. Я пытаюсь написать запрос, который выбирает все карты, которые у конкретного игрока самые быстрые /кратчайшее время

Я пробовал этот запрос:

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'

Однако он выбирает несколько раз, которые не являются самыми короткими / быстрыми для конкретной карты, и даже есть дубликат, когда этот дубликат несуществует в таблице

Любая помощь?=)

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

То, что вы спрашиваете, - это минимальное и максимальное время для каждого игрока, для каждой карты. Это базовый выбор с группировкой по, с необходимым объединением 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
0 голосов
/ 16 октября 2018

Подзапрос, к которому вы присоединяетесь, должен найти минимальное время выполнения для каждого игрока .Таким образом, должно работать следующее:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...