4 Stimmen

MYSQL LEFT JOIN 3 Tabellen enthalten NULL-Sets

Ich habe versucht, die Fragen/Antworten anderer SO-Benutzer auf meine Frage zurückzuverfolgen, konnte es aber nicht. JOINS sind mir immer noch ein Rätsel.

Ich habe drei Tabellen: Rennen (eine Liste aller Rennen), Ergebnis (Ergebnisse für jedes Rennen), Fahrer (Fahrerinformationen). Nicht alle Fahrer haben an allen Rennen auf einer bestimmten Strecke teilgenommen.

Renntabelle

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

Ergebnistabelle

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

Fahrertisch

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

Ich möchte eine Ergebnismenge, die zeigt:

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

Joe Driver nahm nur an 2 der 4 Rennen teil, die nach 2006 auf track_id = 1 stattfanden, und enthält nur Rennen, die vollständig sind (1)

Dies ist meine aktuelle Anfrage:

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

Das Ergebnis, das ich erhalte, zeigt nur die Rennen an, an denen der Fahrer teilgenommen hat:

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

Ich bin sicher, ich übersehe eine einfache Regel für JOINS?

Danke!

3voto

Quassnoi Punkte 396418
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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X