我有两个表:Races
和RacesTimes
,我想从Races
和RacesTimes
仅Finisher
和Time
中提取所有表格,每个RacesTimes.TotalTime
(来自RaceID
的列)中只有最好的RacesTimes
(有限制的ASC,带有LIMIT 1)。
结果将是:
Races.*
,RacesTimes.Finisher
,RacesTimes.Time
这就是我所做的:
SELECT
Races.*,
(
SELECT
`TotalTime`
FROM
`RacesTimes`
WHERE
`RaceID` = Races.ID
ORDER BY
`TotalTime` ASC
LIMIT 1
) AS `BestTime`,
(
SELECT
`Time`
FROM
`RacesTimes`
WHERE
`RaceID` = Races.ID
ORDER BY
`TotalTime` ASC
LIMIT 1
) AS `BestTimeS`,
(
SELECT
`Finisher`
FROM
`RacesTimes`
WHERE
`RaceID` = Races.ID
ORDER BY
`TotalTime` ASC
LIMIT 1
) AS `BestFinisher`
FROM `Races`
它正在全部提取,但查询太长了,不能简化吗?我认为简化版本使用LEFT JOIN或其他类似的东西,我不知道如何使用JOIN查询。
答案 0 :(得分:0)
这里的方法是按种族聚合RaceTimes。诀窍是以最短的时间获得终结者。
MySQL以巧妙的方式使用group_concat()
和substring_index()
为此提供了解决方案。 group_concat()
需要order by argument
,因此可以按时间对结果进行排序。然后最好的终结者处于第一位置。
SQL看起来像这样:
select r.*, rtr.mintt as TotalTime, rtr.Finisher
from Races r join
(select RaceId, MIN(TotalTime) as mintt,
substring_inde(group_concat(finisher separator ',' order by totaltime), 1) as Finisher
from RaceTimes rt
group by RaceId
) rtr
on rtr.RaceId = r.id