SQL - INNER JOIN über 4 Tabellen Problem
Micha Z
- datenbank
0 Vinzenz Mai0 Micha Z
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
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
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
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
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
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