2010-12-22 52 views
4

試圖'反向工程'其他SO用戶問題/我的問題的答案,但不能。連接仍然逃避我。我有三個表格:比賽(所有比賽的列表),結果(每場比賽的結果),車手(車手信息)。並非所有車手都在特定賽道參加所有比賽。MYSQL左加入3表包括NULL集

比賽表

| race_id | track_id | year | complete | 
+-----------+------------+--------+----------+ 
| 1   | 1   | 2006 | 1  | 
| ...  | ...  | ... | ...  | 
| 21  | 1   | 2007 | 1  | 
| ...  | ...  | ... | ...  | 
| 135  | 1   | 2008 | 1  | 
| ...  | ...  | ... | ...  | 
| 215  | 1   | 2009 | 1  | 
| ...  | ...  | ... | ...  | 
| 292  | 1   | 2010 | 1  | 
| ...  | ...  | ... |...  | 
| 351  | 1   | 2011 | 0  | 
+-----------+------------+--------+----------+ 

結果表

| race_id | driver_id | finish | 
+---------+-----------+--------+ 
| 135  | 1   | 15  | 
| ...  | ...  | ... | 
| 292  | 1   | 6  | 
+---------+-----------+--------+ 

驅動程序表

| driver_id | name  | 
+-----------+------------+ 
| 1   | Joe Driver | 
+-----------+------------+ 

我想要的結果集顯示:

| name  | race_id | year | finish | 
+------------+---------+--------+--------+ 
| Joe Driver | 21  | 2007 | NULL | 
| Joe Driver | 135  | 2008 | 15  | 
| Joe Driver | 215  | 2009 | NULL | 
| Joe Driver | 292  | 2010 | 6  | 
+------------+---------+--------+--------+ 

喬驅動僅在賽跑了4場比賽即是在track_id = 1,2006年後的2和僅包括完成座圈(1)

這是我的當前查詢:

SELECT driver.driver, race.id, race.year, result.finish 
FROM race 
LEFT JOIN result ON race.id = result.race_id 
LEFT JOIN driver ON result.driver_id = driver.driver_id 
WHERE race.track_id = 1 
AND race.year > 2006 
AND race.complete = 1 
AND driver.driver_id = 1 
ORDER BY race.id ASC 

結果我得到只顯示了司機在的比賽:

| name  | race_id | year | finish | 
+------------+---------+--------+--------+ 
| Joe Driver | 135  | 2008 | 15  | 
| Joe Driver | 292  | 2010 | 6  | 
+------------+---------+--------+--------+ 

我敢肯定,我忽略了一個簡單的規則來加入?

謝謝!

回答

3
SELECT driver.driver, race.id, race.year, result.finish 
FROM race 
CROSS JOIN 
     driver 
LEFT JOIN 
     result 
ON  result.race_id = race.id 
     AND result.driver_id = driver.driver_id 
WHERE race.track_id = 1 
     AND race.year > 2006 
     AND race.complete = 1 
     AND driver.driver_id = 1 
ORDER BY 
     race.id ASC 
+0

Quassnoi:謝謝!這完全是個訣竅。看起來CROSS JOIN是關鍵。我想問一個關於CROSS JOIN和隨後的LEFT JOIN如何使所有其他驅動程序被過濾掉的聰明問題......但我不能。有關如何瞭解有關JOINS的更多資源的建議? – darrenfauth 2010-12-22 17:51:49