首页 > 解决方案 > 为每个 Track 输出最佳时间,需要一些指导

问题描述

我有一个名为记录的表,它存储每次在轨道上行驶的时间。我只想返回每首曲目的最佳时间。我想设置 TrackId 范围。在这个例子中,我只想要 TrackId 2 和 3。

表看起来像这样


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

我从 2 个名为 Tracks 和 Players 的单独表中获取 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 仅用于获取 Id 的名称。与我的问题无关。

这给了我每首曲目的最佳时间,但是...... PlayerId 是错误的,而不是显示时间为 66774 的玩家 8,而是显示时间为 66774 的玩家 7。我如何保持该行完整?

标签: mysqlsqlsubquery

解决方案


我想我会更像一个过滤问题而不是分组问题来处理这个问题,因为你不需要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)至少有一个..


推荐阅读