Micha Z: SQL - INNER JOIN über 4 Tabellen Problem

Hallo,

ich bastle grad an einem kleinen XT-Shop rum und habe ein Problem mit einem SQL. Leider bin ich in SQL noch nicht fit, daher mal folgende Frage :
Ich habe 4 Tabellen

  • orders
  • orders_products
  • products_description
  • products

Nun möchte ich anhand einer Bestellnummer untere Informationen/Felder aus insgesamt 4 Tabellen mit folgendem SQL holen :
SELECT
orders.orders_id,
orders.orders_status,
orders_products.products_id,
products_description.products_name,
products.products_faq_id
FROM
 orders
INNER JOIN
 orders_products
ON
 orders_products.orders_id = orders.orders_id
INNER JOIN
 products_description
ON
 products_description.products_id = orders_products.products_id
INNER JOIN
 products
ON
 products.products_id = orders_products.products_id
WHERE
 orders.orders_id = 42

=============================================================================================
Obwohl die Bestellung "42" 2 Produkte beinhaltet (1 und 2), sieht die Ausgabe wie folgt aus :

orders_id = 42
orders_status = 3
products_id = 1
products_name =
products_faq_id = 0001

orders_id = 42
orders_status = 3
products_id = 1
products_name = Das tolle Produkt 1
products_faq_id = 0001

=============================================================================================
Erwartet hätte ich aber :

orders_id = 42
orders_status = 3
products_id = 1
products_name = Das tolle Produkt 1
products_faq_id = 0001

orders_id = 42
orders_status = 3
products_id = 2
products_name = Das tolle Produkt 2
products_faq_id = 0002

Offensichtlich hab ich das mit dem INNER JOIN noch nicht so recht verstanden. Hat jemand einen
Hinweis, oder gehe ich eine solche Abfrage sogar völlig falsch an?

Vielen Dank für Hilfe im Voraus
Gruß
MZ

  1. Hallo,

    Nun möchte ich anhand einer Bestellnummer untere Informationen/Felder aus insgesamt 4 Tabellen mit folgendem SQL holen :

    » SELECT  
    
    > 	orders.orders_id,  
    > 	orders.orders_status,  
    > 	orders_products.products_id,  
    > 	products_description.products_name,  
    > 	products.products_faq_id  
    > FROM  
    >  orders  
    > INNER JOIN  
    >  orders_products  
    > ON  
    >  orders_products.orders_id = orders.orders_id  
    > INNER JOIN  
    >  products_description  
    > ON  
    >  products_description.products_id = orders_products.products_id  
    > INNER JOIN  
    >  products  
    > ON  
    >  products.products_id = orders_products.products_id  
    > WHERE  
    >  orders.orders_id = 42
    
    

    Tipp: Nutze Aliasnamen, um zu kürzeren und dennoch aussagekräftigen Tabellenbezeichnern in qualifizierten Spaltenbezeichnern zu kommen, eine Idee:

    o:  orders
     op: orders_products
     pd: products_description
     p:  products

    Obwohl die Bestellung "42" 2 Produkte beinhaltet (1 und 2), sieht die Ausgabe wie folgt aus :

    Weitere Idee: Das Ergebnis einer Abfrage ist eine Tabelle. Schreibe sie zur besseren Verständlichkeit als Tabelle:

    o_id | status | p_id | name                | faq_id
    -------------------------------------------------
      42 |      3 |    1 | NULL                | 0001
      42 |      3 |    1 | Das tolle Produkt 1 | 0001

    Erwartet hätte ich aber :

    o_id | status | p_id | name                | faq_id
    -------------------------------------------------
      42 |      3 |    1 | Das tolle Produkt 1 | 0001
      42 |      3 |    2 | Das tolle Produkt 2 | 0001

    Hat jemand einen Hinweis

    Dies ist mit Deinen Daten, die wir leider nicht kennen, das richtige Ergebnis - wenn auch nicht das von Dir gewünschte. Vermutlich liegt es nicht an Deiner Abfrage, sondern an Deinen Daten. Ich stelle ein paar Mutmaßungen auf:
    Es sieht so aus, als gebe es in Deiner Tabelle products_description zwei Einträge mit dem Wert 1 in der Spalte product_id. Weiterhin ist irgendwo keine Entsprechung für Deine product_id 2 vorhanden, so dass das Resultat keine Werte für diese product_id aufweisen kann.

    Wo die Fehler in Deinen Daten vorliegen, kannst Du über den schrittweisen Aufbau Deiner Abfrage herausfinden:

    1. Nutze nur orders und die WHERE-Klausel
       Prüfe das Resultat
    2. Joine orders_products dazu
       Prüfe das Resultat
       Fehlen von Dir erwartete Datensätze, so prüfe mit einer Abfrage auf
       orders_products mit einer angemessenen WHERE-Klausel
    3. Joine products_description dazu
       Gehe analog zu 2 vor
    4. Joine products dazu

    Falls Du sie noch nicht kennst, ein Hinweis auf unsere JOIN-Artikel in SELFHTML aktuell:
     - Einführung in Joins
     - Fortgeschrittene Jointechniken

    Freundliche Grüße

    Vinzenz

    1. Es sieht so aus, als gebe es in Deiner Tabelle products_description zwei Einträge mit dem Wert 1 in der Spalte product_id. Weiterhin ist irgendwo keine Entsprechung für Deine product_id 2 vorhanden, so dass das Resultat keine Werte für diese product_id aufweisen kann.

      Es sieht nicht nur so aus, sondern das waren GENAU die Fehler !!! Tatsächlich gab es ausgerechnet für die abgefragten Produkte/Beschreibungen keine Einträge mehr in der DB !!! Der SQL war also korrekt. Da hab ich mir wohl zielsicher genau diese Datensätze zum Testen rausgesucht *lach

      Größten(!) Dank für dein waches Auge, ich hätte wahrscheinlich noch ewig gesucht.

      Viele Grüße
      Micha