Вывести лучшее время для каждого трека, нужно некоторое руководство - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица с именем records, которая хранится каждый раз, когда вы ездили по треку. Я только хочу вернуть лучшее время каждого трека. И я хочу установить TrackId Range. В этом примере я хочу, чтобы таблицы TrackId 2 и 3.

выглядели так:


TrackId  PlayerId   Time
  1      2         3453
  1      4         6757
  2      7         5478
  3      7         77453
  3      8         66774

Я получаю имена для TrackId и PlayerId из двух отдельных таблиц, называемых треками и игроками.

То, что я хочу, чтобы результат был:

TrackId    PlayerId    Time     
 2             7       5478
 3             8       66774

То, что я пытался:

SELECT TrackId,
    PlayerId,
    besttime,
FROM
    (
    SELECT 
        TrackId,
        PlayerId,
        MIN(Time) AS besttime,
    FROM
        records
    LEFT JOIN tracks ON tracks.Id = records.TrackId
    LEFT JOIN players ON records.PlayerId = players.Id
    WHERE
        tracks.Id >= 2
    GROUP BY
        TrackId
    ORDER BY
        tracks.Id ASC
) X

LEFT JOIN только там, чтобы получить имена для идентификаторов. Не очень относится к моему вопросу.

Это дает мне лучшее время для каждой дорожки, однако ... Идентификатор игрока неправильный, вместо того, чтобы показывать игрока 8, у которого время 66774, он показывает игрока 7 свремя 66774. Как сохранить ряд неповрежденным?

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Я думаю, я бы подошел к этому скорее как к проблеме фильтрации, чем к проблеме группировки, так как вам не требуется GROUP BY/MIN(), чтобы получить минимальное значение для каждой группы.

Запрос

SELECT 
    records1.TrackId
  , records1.PlayerId
  , records1.Time
FROM 
 records records1 
LEFT JOIN 
 records records2
ON
   records1.TrackId = records2.TrackId # GROUP BY TrackId
 AND
   records1.Time > records2.Time # MIN(Time)
WHERE
   records2.TrackId IS NULL
 AND
   records1.TrackId IN (2,3) 
ORDER BY records1.TrackId   

Результат

| TrackId | PlayerId | Time  |
| ------- | -------- | ----- |
| 2       | 7        | 5478  |
| 3       | 8        | 66774 |

см. демо

Примечание Для производительности на больших таблицах этозапрос действительно должен иметь index(TrackId, Time) как минимум ..

0 голосов
/ 04 октября 2019

Этот запрос даст вам результаты, которые вы хотите. Он использует производную таблицу минимального времени на дорожку, а затем присоединяет ее к записям, чтобы получить соответствующее значение PlayerId. Выражение IN используется для ограничения выбранных дорожек:

SELECT r.TrackId, r.PlayerId, r.Time
FROM records r
JOIN (SELECT TrackId, MIN(Time) AS Time
      FROM records
      GROUP BY TrackId) m ON m.TrackId = r.TrackId and m.Time = r.Time
WHERE r.TrackId IN (2,3)
ORDER BY r.TrackId

Вывод

TrackId PlayerId    Time
2       7           5478
3       8           66774

Демонстрация на dbfiddle

Вы можете добавитьJOIN s необходимо tracks и players, чтобы получить их информацию до предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...