Seite 1 von 1

MySQL Abfrage fieses Problem

Verfasst: 20.07.2005 20:36
von joshy22
Hallo zusammen,

ich habe bereits versucht mit Hilfe der Suchfuntion hier im Forum eine Antwort zu bekommen, jedoch keine direkte Antwort für mein Problem bekommen. Ich hoffe Ihr könnt mir weiterhelfen.

Das Problem:
Es existieren 2 Tabellen: PRODUCT und PRODUCT_ATTR
In der Tabelle PRODUCT stehen "Stammdaten" also z.B. der Name eines Produktes. Die Datensätze werden in dieser Tabelle durch die PRODUCT_ID eindeutig gekennzeichnet. In der Tabelle PRODUCT_ATTR stehen Attribute (Eigenschaften) für die Produkte aus der Tabelle PRODUCT. Die PRODUCT_ID ist Fremdschlüssel in der Tabelle PRODUCT_ATTR.

PRODUCT:

ID_PRODUCT | NAME | REFCODE | PRODUCT_NUMBER | TYPE
-----------------------------------------------------------------------------------
3105 | Füller1 | GH-HZ1 | 653673 | VG
3106 | Füller2 | GH-HZ2 | 653677 | VG
3107 | Füller3 | GH-HZ3 | 653678 | ZH
3108 | Füller4 | GH-HZ4 | 653673 | VG
...usw


PRODUCT_ATTR

ID_ATTR | ID_PRODUCT | NAME | TYPE
---------------------------------------------------------------------------------
1221 | 3105 | Karton | Verpackung
1222 | 3105 | Höhe | tech_data
1223 | 3106 | Folie | Verpackung
...usw

Eine Abfrage auf die beiden Tabelle sollen nun ALLE Produkte vom TYPE VG aus der Tabelle PRODUCT ausgeben die über eine Verpackung verfügen (manche Produkte haben keine Verpackung diese sollen aber trotzdem ausgegeben werden. Die Verpackung befindet sich in der Tabelle PRODUCT_ATTR in der Spalte NAME. Der NAME muss vom TYPE Verpackung sein.

Hier mein Code:

$sql_statement="SELECT PRODUCT.ID_PRODUCT, PRODUCT.PRODUCT_NUMBER, PRODUCT.NAME, PRODUCT.REFCODE, PRODUCT.TYPE, PRODUCT_ATTR.ID_PRODUCT, PRODUCT_ATTR.TYPE, PRODUCT_ATTR.NAME AS NAME2 FROM PRODUCT LEFT JOIN PRODUCT_ATTR ON PRODUCT.ID_PRODUCT = PRODUCT_ATTR.ID_PRODUCT WHERE PRODUCT.TYPE = 'VG' AND PRODUCT_ATTR.TYPE='Verpackung' ORDER BY PRODUCT.PRODUCT_NUMBER";
Die Schwierigkeit: Es kann sehr wohl sein, dass ein Produkt aus der Tabelle PRODUCT einen Datensatz von einem anderen TYPE besitzt z.B. technische Daten. Die SQL Abfrage muss also Produkte finden, die einen Datensatz vom TYPE Verpackung haben, falls für das Produkt keine Verpackung vorhanden trotzdem ausgeben.

VIELEN DANK IM VORAUS

JOSH

Verfasst: 20.07.2005 21:53
von QCO
Eine Abfrage auf die beiden Tabelle sollen nun ALLE Produkte vom TYPE VG aus der Tabelle PRODUCT ausgeben die über eine Verpackung verfügen (manche Produkte haben keine Verpackung diese sollen aber trotzdem ausgegeben werden. Die Verpackung befindet sich in der Tabelle PRODUCT_ATTR in der Spalte NAME. Der NAME muss vom TYPE Verpackung sein.
Hier stimmt doch was nicht, oder?
Es sollen alle Produkte mit Verpackung ausgegeben werden sowie Produkte ohne Verpackung?
Die Vereinigung dieser beiden Mengen sind doch alle Produkte, oder?


Als Schnellschusslösung:

Code: Alles auswählen

SELECT pr.*, attr.*
FROM product pr, product_attr attr 
WHERE pr.id_product = attr.id_product
AND pr.type = 'VG'
AND attr.type = 'Verpackung' 
sollte dir alle Produkte vom Typ VG mit Verpackung liefern...
Allerdings ist diese Art der Abfrage ein Killer für die Performance, wenn du größere Datenbestände hast.
Ich überleg noch an einer eleganteren Lösung...

Verfasst: 20.07.2005 22:06
von QCO
Ich glaube

Code: Alles auswählen

SELECT pr.*, attr.*
FROM product pr
LEFT JOIN product_attr attr ON
(pr.id_product = attr.id_product
AND pr.type = 'VG'
AND attr.type = 'Verpackung')
müsste schneller sein.
Allerdings bin ich mir nicht ganz sicher, bin ein wenig eingerostet :oops:

Verfasst: 21.07.2005 01:15
von joshy22
Sorry hab das Problem schlecht formuliert, da hast du allerdings recht das widerspricht sich. Also ich wollte folgendes ausdrücken:

Alle Produkte vom TYPE VG die einen entsprechenden Datensatz in der Tabelle PRODUCT_ATTR haben (müssen allerdings vom TYPE Verpackung sein) sollen ausgegeben werden. Es kommt aber auch vor, dass Produkte vorhanden sind die keinen Datensatz in der PRODUCT_ATTR haben. In diesem Fall müssen die Produkte trotzdem ausgegeben werden da ich ja eine Liste mit ALLEN Produkten haben will. Die Produkte die keine Verpackung haben sollen dann halt ein leeres Feld haben.
Kompliziert wird es wenn ein Produkt einen Datensatz in der Tabelle PRODUCT_ATTR hat der aber nicht vom TYPE Verpackung ist (also nur andere TYPEN vorhanden sind wie z.B. tech_data). Dann muss dass Produkt auch ausgegeben werden wieder mit leeren Felder für die Verpackung.
Habe die Bedingung mit left join noch nicht hinbekommen.

Vielen Dank

Verfasst: 21.07.2005 06:58
von QCO
OK, Problem verstanden.

Code: Alles auswählen

SELECT pr.*, attr.*
FROM product pr
LEFT JOIN product_attr attr ON pr.id_product = attr.id_product
WHERE pr.type = 'VG'
AND ( attr.type = 'Verpackung' OR attr.id_attr IS NULL)

Verfasst: 22.07.2005 10:50
von joshy22
Klasse, danke!
Hat prima funktioniert :grin: