boingboing
Goto Top

Problem bei SQL Abfrage (inner join)

Hi, habe ein Problem folgende SQL Abfrage umzubauen

Ich habe folgende Abfrage welche mir 78 Ergebnisse zurückliefert und welche auch ordnungsgemäß arbeitet.

SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_ean, p.products_var1, p.products_var2, pd.products_name, p.products_id, p.products_quantity, p.products_image, p.products_weight, pd.products_short_description, pd.products_description, p.manufacturers_id, p.products_price, p.products_vpe, p.products_vpe_status, p.products_vpe_value, p.products_discount_allowed, p.products_tax_class_id, p.products_wbz, p.products_eta, p.products_nnbestellbar
FROM products p
INNER JOIN products_description pd ON p.products_id = pd.products_id
INNER JOIN products_merkmale m ON p.products_model = m.products_id
WHERE p.products_status =  '1'  
AND pd.language_id =  '2'  
AND (
m.merkmale_code =  'ASIA'  
OR m.merkmale_code =  'FÄCHER'  
)
ORDER BY p.products_price ASC 
LIMIT 0 , 30

Des weiteren habe ich 3 Tabellen: products, products_merkmale und products_description

Das knifflige dabei ist die products_merkmale (pm)

pm.products_id | pm.merkmal_code | pm.merkmal_description
1 | ASIA | Aus Asien
1 | Bambus | Aus Bambus hergestellt
1 | Fächer | Faltfächer
2 | ASIA | Aus Asien
3 | ASIA | Aus Asien
3 | FÄCHER | Faltfächer
usw....

die obrige Abfrage gibt mir nun alle Artikel wieder, welche FÄCHER oder ASIA als Merkmal in der der Merkmale-Tabelle haben, soweit sogut.
Nun möchte ich aber nur die Artikel welche FÄCHER >>UND << ASIA in der Merkmal-Tabelle haben.

Mit einem einfachen ändern des ORs in AND in Zeile 09 funktionierts nicht, soweit würde mein SQL - Verständnis auch reichen aber leider ist dann dort Schluss und ohne externe Hilfe würde ich nicht auf die Lösung kommen.

Danke für eure Antworten/Hilfestellungen

Content-ID: 167621

Url: https://administrator.de/contentid/167621

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

thaenhusen
thaenhusen 07.06.2011 um 15:54:18 Uhr
Goto Top
Moin.

SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_ean, p.products_var1, 
p.products_var2, pd.products_name, p.products_id, p.products_quantity, p.products_image, p.products_weight, 
pd.products_short_description, pd.products_description, p.manufacturers_id, p.products_price, p.products_vpe, 
p.products_vpe_status, p.products_vpe_value, p.products_discount_allowed, p.products_tax_class_id, p.products_wbz, 
p.products_eta, p.products_nnbestellbar 
FROM products p 
INNER JOIN products_description pd ON p.products_id = pd.products_id 
WHERE p.products_status =  '1'   
AND pd.language_id =  '2'   
AND p.products_model in(select products_id from products_merkmale where merkmale_code = 'ASIA')  
AND p.products_model in(select products_id from products_merkmale where merkmale_code = 'FÄCHER')  
ORDER BY p.products_price ASC  
LIMIT 0 , 30

Wir wäre es mit IN()-Statements oder alternativ mit Having().

Dann solltest Du zu Deinem Ergebnis kommen.

HTH
MK
Boingboing
Boingboing 07.06.2011 um 16:01:55 Uhr
Goto Top
Dank dir vielmals , klappt wunderbar deine Zeilen, muss sie jetzt nurnoch entsprechend Anpassen

leider zwingt die Abfrage den Server richtig in die Knie vorher 0.0018s nachher 77.132s aber ich werds schon irgendwie hinbekommen ^^
nxclass
nxclass 07.06.2011 um 23:37:39 Uhr
Goto Top
.. man könnte auch in der products_merkmale Tabelle nach products_id gruppieren (GROUP) und auf merkmal_code filtern (WHERE .. OR ..) - dann noch ein COUNT einfügen und nun sollte man bei jeder ID mit einem count = 2 sicher sein das es genau die 2 werte enthält.
Boingboing
Boingboing 09.06.2011 um 16:09:48 Uhr
Goto Top
SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_ean, p.products_var1,
p.products_var2, pd.products_name, p.products_id, p.products_quantity, p.products_image, p.products_weight,
pd.products_short_description, pd.products_description, p.manufacturers_id, p.products_price, p.products_vpe,
p.products_vpe_status, p.products_vpe_value, p.products_discount_allowed, p.products_tax_class_id, p.products_wbz,
p.products_eta, p.products_nnbestellbar
FROM products as p
INNER JOIN products_description pd ON p.products_id = pd.products_id
INNER JOIN (select products_id, COUNT(merkmale_code) from products_merkmale where merkmale_code = 'ASIA' or merkmale_code = 'FÄCHER' GROUP BY products_id HAVING COUNT(merkmale_code) = 2) as blubb ON p.products_model = blubb.products_id  
WHERE p.products_status =  '1'  
AND pd.language_id =  '2'  
ORDER BY p.products_price ASC
Ergebnisse: 23 - 0.231 sek