mysql - 为每个 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。我如何保持该行完整?
解决方案
我想我会更像一个过滤问题而不是分组问题来处理这个问题,因为你不需要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)
至少有一个..
推荐阅读
- reactjs - 有没有办法知道一个承诺是否没有得到解决?
- typescript - 如何扁平化具有嵌套子属性的对象类型?
- python - 我在使用 Netflix 数据时遇到了数据准备问题
- javascript - 如何使用 AWS-SDK 和 MulterS3 将文件上传到数字海洋空间
- saleor - Saleor 迁移失败(django.db.utils.DataError)
- vue.js - 以编程方式设置下拉选项
- python - camelot python将行追加到上一行
- android - 如何在android中一起缩放路径和照片
- django - 如何在搜索用户功能Django中过滤掉用户的朋友
- javascript - 无法在jquery中获取单选按钮的选定值