0

我有两个表:RacesRacesTimes,我只想从Races和中提取所有表,RacesTimes只从每个表(来自 的列)中提取最好的(按 LIMIT 1 排序的 ASC )。FinisherTimeRacesTimes.TotalTimeRaceIDRacesTimes

所以结果是:
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 查询。

4

1 回答 1

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
于 2013-05-06T19:23:06.383 回答