MYSQL LEFT JOIN 3 таблицы содержат наборы NULL - PullRequest
4 голосов
/ 22 декабря 2010

Пытался «перепроектировать» других пользователей SO вопросы / ответы на мой вопрос, но не смог.СОЕДИНЕНИЯ все еще ускользают от меня.

У меня есть три таблицы: гонка (список всех гонок), результат (результаты для каждой гонки), гонщик (информация о гонщике).Не все гонщики участвовали во всех гонках на определенной трассе.

таблица гонок

| 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      |
+------------+---------+--------+--------+

Драйвер Джо участвовал в гонках только в 2 из 4 гонок, которые имели трек с идентификатором track_id = 1, после 2006 года и включает в себя только завершенные гонки (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      |
+------------+---------+--------+--------+

Я уверен, что пропускаюпростое правило для JOINS?

Спасибо!

1 Ответ

3 голосов
/ 22 декабря 2010
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
...