Query-Problem über Suche von 4 Tabellen

julia29

Erfahrenes Mitglied
Bei der Suche über 3 Tabellen werden die Daten aus den 3 Tabellen auch korrekt gefunden.
Bei der Rechnungsadresse werden die entsprechenden Felder aus der Tabelle „kunde“ gezeigt.

PHP:
   # Suche 1 über 3 Tabellen (bestellung + kunde + lieferant)

   $sql = mysql_query("SELECT `bestellung`.*, `kunde`.*, `lieferant`.*
   FROM `bestellung`
   LEFT JOIN `kunde` ON `bestellung`.`user_id` = `kunde`.`user_id`
   LEFT JOIN `lieferant` ON `kunde`.`extra_field_1` = `lieferant`.`lie_nr`
   WHERE `bestellung`.`order_id` = '{$order_id}'"); 
   $row = mysql_fetch_array($sql) or die(mysql_error());

So weit so gut.

Nun gibt es noch eine 4. Tabelle für alternative Lieferadressen. Ist zu einer Bestellung eine andere, alternative Lieferadresse (adresse2) eingetragen, soll diese, neben der Rechnungsadresse auch eingeblendet werden. Bei der Suche über 4 Tabellen werden nach meinem nachfolgenden Ansatz jedoch nur noch Daten gefunden wenn in „adresse2“ etwas vorhanden ist. Gibt es nur eine Rechnungsadresse und keine zusätzliche Lieferadresse wird nichts angezeigt.

Ich habe mir daher überlegt wenn ich schreibe
LEFT JOIN `adresse2` ON `bestellung`
kann ja auch nichts gefunden werden wenn es keine alternative Adresse gibt.

PHP:
   # Suche 2 über 4 Tabellen (bestellung + kunde + lieferant + adresse2)

   $sql = mysql_query("SELECT `bestellung`.*, `kunde`.*, `lieferant`.*, `adresse2`.*
   FROM `bestellung`
   LEFT JOIN `kunde` ON `bestellung`.`user_id` = `kunde`.`user_id`
   LEFT JOIN `lieferant` ON `kunde`.`extra_field_1` = `lieferant`.`lie_nr`
   LEFT JOIN `adresse2` ON `bestellung`.`user_info_id` = `adresse2`.`user_info_id`
   WHERE `bestellung`.`order_id` = '{$order_id}'"); 
   $row = mysql_fetch_array($sql) or die(mysql_error());

Schreibe ich dagegen
OR LEFT JOIN `adresse2` ON `bestellung`
kommt Fehlermeldung, soll noch mal im Manual nachlesen …..

Meine Frage – wie schreibe ich mein Query richtig, das nur Daten gezeigt werden, wenn in Tabelle „adresse2“ auch welche für diese Bestellung vorhanden sind?
 
OR LEFT JOIN ist ungültig. Da hat ein OR nix verloren

Du hast es doch bereits richtig:
Bei der Suche über 4 Tabellen werden nach meinem nachfolgenden Ansatz jedoch nur noch Daten gefunden wenn in „adresse2“ etwas vorhanden ist.
Meine Frage – wie schreibe ich mein Query richtig, das nur Daten gezeigt werden, wenn in Tabelle „adresse2“ auch welche für diese Bestellung vorhanden sind?
Ist doch genau das was du suchst...
 
Hallo Yaslaw,

blöd von mir - habe mich nicht ganz richtig /vollständig ausgedrückt.

Wird in "adresse2" nichts gefunden, weil es keine zusätzliche Lieferadresse gibt, wird auch die normale Rechnungsadresse aus "kunde" nicht gezeigt. Diese ist aber IMMER vorhanden.
Bei der Abfrage über 3 Tabellen klappt das alles richtig.

Nun dachte ich könnte dies an meiner Abfrage zur 4. Tabelle liegen.
 
Das SQL an sich sieht richtig aus (ausser dass du die ID als Nummer und nicht als String vergleichen solltest, sofern es eine Nummer ist)
Wird kein Datensatz angezeigt oder sind die Adressfelder leer?
Im Zweiten Fall, könnte es sein, dass du dieselben Feldernamen in kunde und adresse2 hast?

Aus der PHP-Doku zu mysql_fetch_array
Falls zwei oder mehrere Spalten des Ergebnisses den gleichen Feldnamen haben, dann wird nur der Wert der letzten Spalte im Array unter diesem Feldnamen abgelegt. Um auch auf die anderen gleichnamigen Spalten zugreifen zu können, müssen Sie den numerischen Index der Spalte verwenden oder einen Alias für die Spalte vergeben. Falls Sie Aliase für Spalten verwenden, können Sie auf die Inhalte dieser Spalten nicht über ihren ursprünglichen Namen zugreifen. (In folgendem Beispiel können Sie 'field' nicht benutzen).
SQL:
SELECT table1.fielda AS foo, table2.fielda AS bar FROM table1, table2

Wenn ja, dann weg mit dem tödlichen SELECT table.*. Das sollte man sowieso nicht machen.
 
Zuletzt bearbeitet von einem Moderator:
Super, danke, für den Tip
Im weiten Fall .... die Feldnamen die tatsächlich benötigt werden haben den gleichen Namen.
Umgeändert und nun klappt alles.
Danke nochmal.
Julia
 
Zurück