MySQL子查询简化

时间:2013-05-06 19:16:06

标签: mysql subquery

我有两个表:RacesRacesTimes,我想从RacesRacesTimesFinisherTime中提取所有表格,每个RacesTimes.TotalTime(来自RaceID的列)中只有最好的RacesTimes(有限制的ASC,带有LIMIT 1)。

结果将是:
Races.*RacesTimes.FinisherRacesTimes.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查询。

1 个答案:

答案 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