2010-12-22 7 views
4

Versucht, andere SO-Benutzer Fragen/Antworten auf meine Frage, aber konnte nicht 'zurückentwickeln'. JOINS entziehen sich mir immer noch.MYSQL LINKER JOIN 3 Tabellen enthalten Nullsätze

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

Rennen Tisch

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

Treibertabelle

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

ich eine Ergebnismenge wollen, das 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 Fahrer fuhr nur in 2 der 4 Rennen, die nach 2006 bei track_id = 1, waren und enthält nur Rennen, die abgeschlossen sind (1)

Dies ist meine aktuelle Abfrage:

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 ich bekomme nur die Rennen zeigt der Fahrer war in:

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

ich bin sicher, ich bin mit Blick auf eine einfache Regel zu JOINS?

Danke!

Antwort

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: Danke! Das macht den Trick genau. Sieht aus wie CROSS JOIN ist der Schlüssel. Ich möchte eine intelligente Frage stellen, wie der CROSS JOIN und der nachfolgende LEFT JOIN alle anderen Treiber aus der Abfrage herausfiltern lassen ... aber ich kann nicht. Vorschläge für die beste Ressource, um mehr über JOINS zu erfahren? – darrenfauth

+0

@darrenfauth: Lesen Sie die Dokumentation für die Starter und meine Website, http://explainextended.com, für weitere Themen :) – Quassnoi

+0

Und es ist 'driver.driver_id = 1' in der' WHERE'-Klausel, die die anderen Treiber ausfiltert, nicht die Joins. Entfernen Sie 'driver.driver_id = 1' und Sie werden alle Treiber sehen. – Quassnoi