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