MySQL: SQL Abfrage mit oder ohne Sub Query?

tklustig

Erfahrenes Mitglied
Hallo,
folgendes Query liefert folgendes Resultat:
select id, parent_id from product;
1716457153940.png
Die Interpretation diese Ausgabe sei folgende:
Diejenigen, die eine Parent ID haben, sind die Variantenprodukte und die in parent_id hinterlegte ID ist die des Masterprodukts.
Die Abfrage, die mir alle Masterprodukte ohne Variantenprodukte liefert, dürfte stimmig sein und lautet wie folgt(kann leider kein ER Diagramm beisteuern):
SQL:
SELECT CONCAT("Masterprodukt") AS ConcatenatedString,product.id AS primaerschluessel,product_translation.name AS description, product.product_number AS prduktnummer 
FROM product
LEFT JOIN product_translation ON product.id=product_translation.product_id
WHERE product.parent_id IS NULL
AND product_translation.language_id=UNHEX('2fbb5fe2e29a4d70aa5854ce7ce3e20b');

Nun meine Frage:
Wie formuliere ich das Query um
a) alle Variantenprodukte ohne das dazugehörige Masterprodukt zu bekommen?
b) für jedes einzelne Masterprodukt das dazugehörige Variantenprodukt zu bekommen?
zu a) Ist das stimmig?
SQL:
SELECT CONCAT("Masterprodukt") AS ConcatenatedString,product.id AS primaerschluessel,product_translation.name AS description, product.product_number AS produktnummer 
FROM product
LEFT JOIN product_translation ON product.id=product_translation.product_id
WHERE product.parent_id IS NOT NULL
AND product_translation.language_id=UNHEX('2fbb5fe2e29a4d70aa5854ce7ce3e20b');

zu b)
Da fehlt mir der Ansatz. Benötige ich dafür ein Sub Query?
 

Anhänge

  • 1716457144933.png
    1716457144933.png
    17,2 KB · Aufrufe: 0
Zuletzt bearbeitet von einem Moderator:
Lösung
Ungetestet
SQL:
SET @languageID='2fbb5fe2e29a4d70aa5854ce7ce3e20b';
SELECT master.id, MIN(master.name) AS masterBez, 
variant.id, MIN(variant.name) AS variantBez
FROM
(SELECT product.id, prodTrans.name, product.parent_id
FROM product
   LEFT JOIN product_translation AS prodTrans
ON product.id=prodTrans.Product_id 
AND prodTrans.language_id=UNHEX(@languageID)
) As master
INNER JOIN
(SELECT product.id, prodTrans.name, product.parent_id
FROM product
   LEFT JOIN product_translation AS prodTrans
ON product.ID=prodTrans.product_id 
AND prodTrans.language_id=UNHEX(@languageID)
) AS variant
ON variant.parent_id=master.id
GROUP BY master.id, variant.id;

Und ich habe dein WHERE in den Sub-Selects in ein AND verwandelt, damit es weiterhin ein...
Was willst du da gruppieren?
aus deinem ersten post hast du für ein Produkt 3 Varianten (Das mit FAA am Ende)
der join wird dafür immer 3 mal das Master auswerfen

oder du hast was in den Daten was wir nicht sehen.

ansonsten: beide „name“ felder im Select in ein MIN einklammern, und ganz am ende dann das group by nach beiden id‘s

ich geh mal von aus dass pro languga-id immer nur ein name vorhanden ist
 
Ungetestet
SQL:
SET @languageID='2fbb5fe2e29a4d70aa5854ce7ce3e20b';
SELECT master.id, MIN(master.name) AS masterBez, 
variant.id, MIN(variant.name) AS variantBez
FROM
(SELECT product.id, prodTrans.name, product.parent_id
FROM product
   LEFT JOIN product_translation AS prodTrans
ON product.id=prodTrans.Product_id 
AND prodTrans.language_id=UNHEX(@languageID)
) As master
INNER JOIN
(SELECT product.id, prodTrans.name, product.parent_id
FROM product
   LEFT JOIN product_translation AS prodTrans
ON product.ID=prodTrans.product_id 
AND prodTrans.language_id=UNHEX(@languageID)
) AS variant
ON variant.parent_id=master.id
GROUP BY master.id, variant.id;

Und ich habe dein WHERE in den Sub-Selects in ein AND verwandelt, damit es weiterhin ein LEFT JOIN bleibt
 
Lösung
Ja, pro language FK ist immer nur eine Bezeichnung vorhanden!

Vielen Dank, Zvoni , für Deine Hilfe. Ohne Dich hätte ich dieses Query nicht zuwege gebracht. Werde diesen Thread heute Abend als gelöst markieren, damit Du diesen meinen letzten Post zur Sache noch zur Kenntnis nimmst. Anbei die Resultate des obigen Queries mit und ohne Gruppierung, damit Dir klar wird, warum ich eine Gruppierung benötige:
Mit Gruppierung kann ich klar erkennen, dass dieselben Variantenprodukte redundant einem Materprodukt zugeordnet sind
1716886273563.png

Ohne Gruppierung kann ich das nicht erkennen. Der Response zeigt nur einen einzigen Record auf:
1716886801710.png
 

Anhänge

  • 1716886260564.png
    1716886260564.png
    110,4 KB · Aufrufe: 1
Zuletzt bearbeitet:
Zurück