MySQL Abfrage fieses Problem

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
joshy22
Mitglied
Beiträge: 3
Registriert: 20.07.2005 20:35

MySQL Abfrage fieses Problem

Beitrag 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
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag 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...
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag 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:
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
joshy22
Mitglied
Beiträge: 3
Registriert: 20.07.2005 20:35

Beitrag 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
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag 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)
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
joshy22
Mitglied
Beiträge: 3
Registriert: 20.07.2005 20:35

Beitrag von joshy22 »

Klasse, danke!
Hat prima funktioniert :grin:
Antworten

Zurück zu „Coding & Technik“