Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL子查询简化_Mysql_Subquery - Fatal编程技术网

MySQL子查询简化

MySQL子查询简化,mysql,subquery,Mysql,Subquery,我有两个表:Races和RacesTimes,我想从RacesTimes和RacesTimes中提取所有的RacesTimes和Finisher和Time,只有最好的RacesTimes。TotalTime(按限制1排序的ASC)从每个RacesTimes(来自RacesTimes的一列) 因此结果将是: Races.*,RacesTimes.Finisher,RacesTimes.Time 这是我做的: SELECT Races.*, ( SELECT

我有两个表:
Races
RacesTimes
,我想从
RacesTimes
RacesTimes
中提取所有的
RacesTimes和
Finisher
Time
,只有最好的
RacesTimes。TotalTime
(按限制1排序的ASC)从每个
RacesTimes
(来自
RacesTimes
的一列)

因此结果将是:
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的查询。

这里的方法是按种族聚合比赛时间。诀窍是以最短的时间到达终点

MySQL提供了一个解决方案,通过巧妙地使用
group\u concat()
substring\u index()
group_concat()
采用按参数排序的方法,因此它可以按时间对结果排序。那么最好的终结者在第一个位置

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

创建一个。那样的话,我们有更好的方法来帮助你。它仍然很长,不能更短吗?