2010-12-22 98 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