dedlfix: LEFT JOIN auf zwei Spalten

Beitrag lesen

Tach!

Ich mache sowas mit zwei Joins, und zur Unterscheidung nehme ich Table Aliase.

SELECT s.bereich_name as Sender, e.bereich_name as Empfaenger
FROM todo_grunddaten g
     LEFT JOIN todo_bereich s ON g.bereichSender = s.tb_code
     LEFT JOIN todo_bereich e ON g.bereichEmpfaenger = e.tb_code

verstehe ich ehrlich gesagt nicht so recht. Woher kommen z.B. diese "s.bereich_name as Sender, e.bereich_name as Empfaenger" Werte? Ich habe es mal in meine Funktion eingesetzt

s und e und auch g sind die erwähnten Aliase zu den davorstehenden Tabellennamen. Man nimmt solche Aliase, um beim mehrfachen Verknüpfen derselben Tabelle zu unterscheiden, welche der beiden Vorkommen man meint. Oder wie im Falle von g, weil man sich damit kürzer auf eine Tabelle beziehen kann.

        $stmt = $mysqli->prepare("SELECT id, code, kurzbeschreibung, art, erstellungsdatum, job, bereichSender, apSender, bereichEmpfaenger, apEmpfaenger, prio, status,
                                         fertigstellung_sender, fertigstellung_uhrzeit_sender, fertigstellung_empfaenger, fertigstellung_uhrzeit_empfaenger, beschreibung,
                                         ta_titel, tp_titel, ts_titel, tb_titelkurz, s.bereich_name as Sender, e.bereich_name as Empfaenger
                                  
                                  FROM todo_grunddaten
                                 
                                  LEFT JOIN todo_art ON todo_art.ta_code = todo_grunddaten.art
                                  LEFT JOIN todo_prio ON todo_prio.tp_code = todo_grunddaten.prio
                                  LEFT JOIN todo_status ON todo_status.ts_code = todo_grunddaten.status
                                  LEFT JOIN todo_bereich s ON g.bereichSender = s.tb_code
                                  LEFT JOIN todo_bereich e ON g.bereichEmpfaenger = e.tb_code");

Hilfe! Weißt du auswendig, welche Spaltennamen im SELECT zu welcher Tabelle gehören? Bist du dir sicher, dass du das in Zukunft auch noch weißt, wenn du dich mal eine Weile lang nicht mehr damit beschäftig hast? Bei solchen Monster-Joins nimm lieber Aliase oder Tabellenamen zu den Feldern, damit die Herkunft klar ist. Ich würde auch lieber die Subquerys empfehlen, weil "übersichtlich" anders geht als mit Joins.

Allerdings erhalte ich dann eine Fehlermeldung

Fatal error: Call to a member function execute() on boolean in

$stmt ist dann wohl nicht das Statement-Objekt sondern ein boolean. Warum? Schau da, wo es zugewiesen wurde. So ein Prepare gibt im Fehlerfall nicht das Statement sondern einen booleaschen Wert zurück. Wenn man diese Möglichkeit nicht abfängt, gibts dann solche Folgefehler. Die eigentliche Ursache wird sein, dass das Statement fehlerhaft ist und nicht präpariert werden konnte. Die genaue Meldung gibts in $mysqli->error.

dedlfix.