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 |
+------------+---------+--------+--------+
我敢肯定,我忽略了一個簡單的規則來加入?
謝謝!
Quassnoi:謝謝!這完全是個訣竅。看起來CROSS JOIN是關鍵。我想問一個關於CROSS JOIN和隨後的LEFT JOIN如何使所有其他驅動程序被過濾掉的聰明問題......但我不能。有關如何瞭解有關JOINS的更多資源的建議? – darrenfauth 2010-12-22 17:51:49