2017-01-09 49 views
0

我有这种棘手的情况与多个JOINS,我有点卡住了。让我详细说明。使用双GROUP BY时获得MIN()GROUP BY

我有这些表:

种族

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 

RACERS

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 

LAPS

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应该返回我最快某赛车手的一圈。

这是一个sqlfiddle链接。

+0

见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-我试过你的建议,但它does not工作。也许你有困惑与system_id列。它是分开的对于什么似乎对我来说是一个非常简单的SQL查询 – Strawberry

回答

1

MIN和“double group by”不是问题所在。

看起来你错过了一个连接条件。它看起来像加入laps应该包括匹配到一个特定的races。我只看到给定racers的连接条件。

如果有一个race_idlaps,则这样的事:

... 
    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表。单圈时间不依赖于赛车手......这取决于赛车手和比赛...赛车手参加比赛。

如果没有办法将lapsracers_races中的特定行相匹配,那么该架构存在问题。

另一种可能性(当然)是模式是正确的。查询将返回赛车的最快圈速,因此对于给定的racers,每个races查询将返回相同的最快时间。


另请注意,WHERE子句中的条件否定了LEFT JOIN的外部性。如果你真的想要的是一个“外”连接,然后将这种状态进入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 
    ... 
+0

每个表,它就像是除了赛车手表上的第二个主ID,可以有相同的system_id。 – Shile

+0

最初的查询从'laps'到'racer'有一个连接条件,所以lap中的一行将匹配该赛手的所有比赛。看起来我们还需要一个符合'lap'到特定'race_id'的条件。 (我在'laps'中看到的唯一一个看起来像外键的列是'system_id'列...给出示例数据中的值1,3,7,不清楚应该匹配哪个列还有什么其他的表,也许这个模式需要''laps'中的'race_id'列呢?在我看来,'laps'中应该有一个引用'racers_races'表的外键列。) – spencer7593

+0

是的,你说得对。我将** race_id **添加到** laps **表中,然后在** racers_races **表中引用它,现在它应该有它的工作。我还有另一个错误,** laps_completed **应该在** racers_races **表中不是**赛车手**。无论如何,非常感谢。 – Shile