2017-01-09 81 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