Gibt es eine Möglichkeit LEFT / RIGHT JOINs einzuschränken auch wenn nicht für alle Datensätze verknüpfte Daten gefunden werden?
Ein Beispiel: Man hat einen Stundenplan der sich aus mehreren Tabellen zusammen setzt (Klassen, Lehrer, Räume, etc). Nun fragt man die Stunden für eine Klasse ab ergänzt mit mehreren JOINs weitere Informationen. Zusätzlich möchte man jetzt noch im Stundenplan anzeigen wenn es für eine Stunde einen Eintrag im Vertretungsplan gibt (wenn die Stunde ausfällt, ein Vertretungslehrer einspringt oder der Raum gewechselt wurde). Dazu ergänzt man die Tabelle mit den Vertretungsstunden über einen LEFT JOIN:
Daraus ergibt sich natürlich ein Problem - in der Tabelle mit den Vertretungsstunden stehen ja nicht nur die Stunden für die aktuelle Woche - man muss die Zeit also einschränken:
Das funktioniert so nicht, denn jetzt werden nur Stunden angezeigt für die auch eine Vertretungsstunde existiert (wenn nicht ist substitutions.date ja NULL). Also erweitert man die Bedingung etwas und prüft ob überhaupt eine Verknüpfung vorliegt:
... Ergebnis: Es werden einige Stunden angezeigt bei denen die Felder aus substitutions dann auch komplett NULL sind - es fehlen allerdings die Stunden die irgendwann mal eine Vertretungsstunde hatten die jetzt nicht mehr im Zeitraster liegt. Angezeigt werden also alle Stunden bei denen entweder die Vertretungsstunde im Zeitraster liegt oder die noch nie eine Vertretungsstunde hatten - kann man die Bedingungen so anpassen, dass das korrekt funktioniert?
Ein Beispiel: Man hat einen Stundenplan der sich aus mehreren Tabellen zusammen setzt (Klassen, Lehrer, Räume, etc). Nun fragt man die Stunden für eine Klasse ab ergänzt mit mehreren JOINs weitere Informationen. Zusätzlich möchte man jetzt noch im Stundenplan anzeigen wenn es für eine Stunde einen Eintrag im Vertretungsplan gibt (wenn die Stunde ausfällt, ein Vertretungslehrer einspringt oder der Raum gewechselt wurde). Dazu ergänzt man die Tabelle mit den Vertretungsstunden über einen LEFT JOIN:
Code:
LEFT JOIN substitutions ON substitutions.time_id = times.id
Code:
WHERE ... AND substitutions.date BETWEEN ? AND ?
Code:
((substitutions.date BETWEEN ? AND ? ) OR substitutions.date IS NULL)
Kommentar