使用双 GROUP BY 时获取 MIN()
Get MIN() when using double GROUP BY
我遇到了多个 JOINS 的棘手情况,我有点 stuck.Let 我很详细。
我有这些表:
种族
id | system_id | track | race_name | race_date
----------------------------------------------
1 | 3 | Track1| Name | 2016-10-07
2 | 5 | Track1| Name | 2016-10-08
3 | 6 | Track1| Name | 2016-10-09
赛车手
id | system_id | racer_name | gender | bday | from | laps_completed
------------------------------------------------------------------------
1 | 10002 | Name1 | 1 | 1996-10-07|Place | 14
2 | 10003 | Name2 | 0 | 1996-10-08|Place2| 33
3 | 10004 | Name3 | 1 | 1996-10-09|Place3| 44
RACERS_RACES
id | race_id | racer_id
-----------------------
1 | 3 | 10002
2 | 5 | 10004
3 | 6 | 10003
圈数
id | lap_time | system_id | racer_id
------------------------------------
1 | 25.33 | 1 | 10002
2 | 23.11 | 3 | 10003
3 | 28.55 | 7 | 10004
我试过做这个查询:
SELECT r.system_id,MIN(l.lap_time) as fastest_lap,ra.racer_name,ra.racer_from,r.race_name,ra.laps_completed,r.race_date
FROM races r
LEFT JOIN racers_races rr ON r.system_id=rr.race_id
LEFT JOIN racers ra ON rr.racer_id=ra.system_id
LEFT JOIN laps l ON ra.system_id=l.racer_id
WHERE l.lap_time!=0
GROUP BY r.system_id,l.racer_id
ORDER BY l.lap_time ASCenter code here
我的问题是,当我有多个赛车手时,我在不同的比赛中有相同的最快圈速,不应该 way.It 应该 return 我是某场比赛中赛车手的最快圈速。
这是一个sqlfiddlelink.
MIN 和 "double group by" 不是问题。
您似乎缺少连接条件。看起来 laps
的连接应该包括与特定 races
的匹配。我只看到给定 racers
.
的连接条件
如果 laps
中有 race_id
列,则如下所示:
...
LEFT JOIN laps l
ON l.racer_id = ra.system_id
AND l.race_id = rr.race_id
WHERE l.lap_time != 0
...
对我来说,看起来我们真的希望从 laps
加入到 racers_races
table。单圈时间不取决于赛车手......它取决于赛车手和比赛......赛车手参加比赛。
如果无法将 laps
与 racers_races
中的特定行相匹配,则架构存在问题。
另一种可能性(当然)是模式是正确的。并且查询只是 return 赛车手的最快圈速,因此对于给定的 racers
,对于每个 races
,查询将 return 相同的最快时间。
另请注意,WHERE 子句中的条件否定了 LEFT JOIN 的外部性。如果您真的希望它成为 "outer" 连接,则将该条件移至 ON
子句
...
LEFT JOIN laps l
ON l.racer_id = ra.system_id
AND l.<race_id> = rr.race_id
AND l.lap_time != 0
WHERE 1=1
...
我遇到了多个 JOINS 的棘手情况,我有点 stuck.Let 我很详细。
我有这些表:
种族
id | system_id | track | race_name | race_date
----------------------------------------------
1 | 3 | Track1| Name | 2016-10-07
2 | 5 | Track1| Name | 2016-10-08
3 | 6 | Track1| Name | 2016-10-09
赛车手
id | system_id | racer_name | gender | bday | from | laps_completed
------------------------------------------------------------------------
1 | 10002 | Name1 | 1 | 1996-10-07|Place | 14
2 | 10003 | Name2 | 0 | 1996-10-08|Place2| 33
3 | 10004 | Name3 | 1 | 1996-10-09|Place3| 44
RACERS_RACES
id | race_id | racer_id
-----------------------
1 | 3 | 10002
2 | 5 | 10004
3 | 6 | 10003
圈数
id | lap_time | system_id | racer_id
------------------------------------
1 | 25.33 | 1 | 10002
2 | 23.11 | 3 | 10003
3 | 28.55 | 7 | 10004
我试过做这个查询:
SELECT r.system_id,MIN(l.lap_time) as fastest_lap,ra.racer_name,ra.racer_from,r.race_name,ra.laps_completed,r.race_date
FROM races r
LEFT JOIN racers_races rr ON r.system_id=rr.race_id
LEFT JOIN racers ra ON rr.racer_id=ra.system_id
LEFT JOIN laps l ON ra.system_id=l.racer_id
WHERE l.lap_time!=0
GROUP BY r.system_id,l.racer_id
ORDER BY l.lap_time ASCenter code here
我的问题是,当我有多个赛车手时,我在不同的比赛中有相同的最快圈速,不应该 way.It 应该 return 我是某场比赛中赛车手的最快圈速。
这是一个sqlfiddlelink.
MIN 和 "double group by" 不是问题。
您似乎缺少连接条件。看起来 laps
的连接应该包括与特定 races
的匹配。我只看到给定 racers
.
如果 laps
中有 race_id
列,则如下所示:
...
LEFT JOIN laps l
ON l.racer_id = ra.system_id
AND l.race_id = rr.race_id
WHERE l.lap_time != 0
...
对我来说,看起来我们真的希望从 laps
加入到 racers_races
table。单圈时间不取决于赛车手......它取决于赛车手和比赛......赛车手参加比赛。
如果无法将 laps
与 racers_races
中的特定行相匹配,则架构存在问题。
另一种可能性(当然)是模式是正确的。并且查询只是 return 赛车手的最快圈速,因此对于给定的 racers
,对于每个 races
,查询将 return 相同的最快时间。
另请注意,WHERE 子句中的条件否定了 LEFT JOIN 的外部性。如果您真的希望它成为 "outer" 连接,则将该条件移至 ON
子句
...
LEFT JOIN laps l
ON l.racer_id = ra.system_id
AND l.<race_id> = rr.race_id
AND l.lap_time != 0
WHERE 1=1
...