0

私は2 つのテーブルを持っています:とRaces、とからのみ、と からRacesTimesすべてを抽出したいです。RacesRacesTimesFinisherTimeRacesTimes.TotalTimeRaceIDRacesTimes

したがって、結果は次のようになり
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 でクエリを使用する方法がわかりません。

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 に答える