2013-05-06 81 views
0

我有两个表:RacesRacesTimes,我想所有的RacesRacesTimes只有FinisherTime,只有最好的RacesTimes.TotalTime(有序ASC与LIMIT 1)从每个RaceID(从列中提取RacesTimes)。MySQL的子查询简化

那么结果将是:
Races.*RacesTimes.FinisherRacesTimes.Time

这是我编:

SELECT *种族(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

据提取corectly所有,但查询是方式太长了,难道不能简化吗?我认为简化版本使用了LEFT JOIN或其他类似的东西,我不知道如何在JOIN中使用查询。

+0

创建[SQLFiddle(http://www.sqlfiddle.com/)。这样,我们有更好的方式来帮助你。 – 2013-05-06 19:22:30

回答

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 
+0

它还很长,它不能更短? – 2013-05-06 19:28:53