Seite 1 von 1

UNION Abfrage falsch?

Verfasst: Fr 10. Jun 2011, 07:25
von Josef
hallo,
ich möchte 2 verknüpfte Tabellen abfragen, leider läuft das nicht so.

Code: Alles auswählen

SELECT `products_id` `products_name` `products_meta_title`
FROM products_description
UNION SELECT `products_id`
FROM products
WHERE `products_quantity` >0
entweder ich bekomme nur die IDs wenn ich `products_meta_title` weglasse oder einen Fehler. :roll: :roll:

Re: UNION Abfrage falsch?

Verfasst: Fr 10. Jun 2011, 08:09
von Doc Olson
Mehrere Fehler:

1. UNION SELECT ist nicht das, was Du willst.
2. 'products_quantity' existiert nicht in 'products_description'.
3. fehlen die Kommas in der Auflistung
4. bräuchte UNION die gleiche Anzahl Spalten

Was DU willst, ist das hier:

Code: Alles auswählen

SELECT pd.products_id, pd.products_name, pd.products_meta_title
FROM products_description pd
JOIN products p
ON p.products_id = pd.products_id
WHERE p.products_quantity > 0

Re: UNION Abfrage falsch?

Verfasst: Fr 10. Jun 2011, 08:51
von Josef
hallo Doc,

das ist genau das was ich will.
Vielen Dank für die Hilfe, toll! :)
Wusste nicht, dass UNION nur gleiche Tabellen berücksichtigt. Wieder was dazu gelernt.

Noch eine Frage: wo ist der Unterschied zwischen join und lefter(righter) join?
Danke

Re: UNION Abfrage falsch?

Verfasst: Sa 11. Jun 2011, 05:34
von yogi
Moin Josef,

zwischen einem "join" muss in der gejointen Tabelle ein passender Eintrag vorhanden sein, bei einem "left [outer] join" hingegen nicht.

Folgendes SQL liefert i.d.R. kein Ergebnis, da es die language_id=100 im Shop (i.d.R.) nicht gibt:

Code: Alles auswählen

select *
from products p
join products_description pd on p.products_id=pd.products_id and pd.language_id=100;
Um nun zumindest die Daten aus der products Tabelle zu erhalten nutzt man den "left join", da dieser es auch erlaubt das in der gejointen Tabelle keine Spalte gefunden wird:

Code: Alles auswählen

select *
from products p
left join products_description pd on p.products_id=pd.products_id and pd.language_id=100;
Wenn Du nun nur die Zeilen sehen möchtest die KEINEN Eintrag in der products_description haben hilft die folgende WHERE Bedingung:

Code: Alles auswählen

where pd.products_id is NULL
da die Spalteninhalte wenn keine passende Datenzeile gefunden wird auf "NULL" gesetzt werden.
Diese Bedingung kann nicht im "on" beim "join" angegeben werden, da es dort keinen NULL-Wert gibt!

Code: Alles auswählen

select *
from products p
left join products_description pd on p.products_id=pd.products_id and pd.language_id=100
where pd.products_id is NULL;

Re: UNION Abfrage falsch?

Verfasst: Sa 11. Jun 2011, 07:08
von Josef
Hallo Yogi,

super erklärt,
jetzt wird mir einiges klar.
Vielen Dank

Josef