MySQL: Hersteller-Tabelle aus Artikel-Tabelle befüllen

Hallo, da mein Plan nicht über die Mehrfachänderung im Backend realisiert werden kann, muss es wohl über eine Datenbank-Operation geschehen, aber mein Know genügt nicht. Vielleicht klappt’s mit dem Schwarmwissen aus dem Forum:

In der Datenbank befinden sich rund 1.000 Artikel. Diese sind nach ungefähr 100 übergeordneten Designs benannt. Die Designs haben Namen, die für die Produktnamen Verwendung finden. Es gibt folglich immer mehrere Produkte (ca. 10 pro Design) mit identischem Namen. Anders ausgedrückt: jedes Produkt hat den Design-Namen als Produktnamen und wird über Beschreibung, Artikelnummer und ein Freitextfeld eindeutig abgegrenzt/identifiziert.

Beispiel einer solchen Produktreihe wäre:
„Motiv-Eins“ (Tasse), „Motiv-Eins“ (Kissen), „Motiv-Eins“ (T-Shirt), „Motiv-Eins“ (Handyhülle), „Motiv-Eins“ (Karte), …
„Motiv-Zwei“ (Tasse), „Motiv-Zwei“ (Kissen), „Motiv-Zwei“ (T-Shirt), „Motiv-Zwei“ (Handyhülle), „Motiv-Zwei“ (Karte), …

Bisher sind alle Artikel einem einzigen Hersteller (Eigenmarke) zugeordnet. Nun möchte ich aber mit den Informationen aus der Tabelle „s_articles“ die Tabelle „s_articles_supplier“ befüllen, mit folgendem Aufbau:

Die Spalte „name" aus Tabelle „s_articles“ füllt die Spalte „name“ in Tabelle „s_articles_supplier“. Dabei müssen Duplikate vermieden werden. Auch wenn es 10 Produkte mit Name „Motiv-Eins“ gibt, darf nur ein Eintrag mit dem Design „Motiv-Eins“ in der Tabelle „s_articles_supplier" erstellt werden. Jeder angelegte Eintrag erhält hierbei seine automatisch erzeugte, fortlaufende, eindeutige Nummer in Spalte „id“ beginnend bei 1.

Ziel: Ich erhalte aus 10 Produkten mit Name „Motiv-Eins“ einen einzigen gleichnamigen Eintrag in der Tabelle „s_articles_suppliers" (keine 10 Einträge), genauso einen aus den 10 Produkten mit dem Namen „Motiv-Zwei“, usw…

Danach Schritt 2:

In der Folge soll die „id“ aus „s_articles_suppliers" dann zurück gematcht werden. Also die erzeugten Hersteller-IDs müssen den jeweilig zugehörigen Artikeln zugeordnet werden. Die Spalte „supplierID“ in Tabelle „s_articles“ muss dazu aus Spalte „id" von Tabelle „s_articles_supplier“ befüllt werden, und zwar immer so dass „name" in Tabelle „s_articles" zu „name" aus Tabelle „s_articles_supplier“ matcht. Am Beispiel:

Hersteller in s_articles_supplier „Motiv-Eins“ hat die id „1“ bekommen, diese wird in Tabelle s_articles bei allen Produkten mit name „Motiv-Eins“ in Spalte „supplierID“ eingetragen.
Hersteller in s_articles_supplier „Motiv-Zwei" hat die id „2“ bekommen, diese wird in Tabelle s_articles bei allen Produkten mit name „Motiv-Zwei“ in Spalte „supplierID“ eingetragen.
usw…

Habe ich verständlich erklärt, was das Ziel/Vorhaben ist? Ich hoffe man kann verstehen was ich erreichen möchte. Kann mir jemand helfen, die SQL-Statements zu formulieren? Meine Versuche haben bisher nicht zum Erfolg geführt. Und bevor ich noch weitere Male das DB-Backup zurückspiele, hab ich mir gedacht ich frag hier mal jemanden der sich auskennt.  Wink

Sofern der Aufbau stimmt sollte dir SUBSTRING_INDEX hier behilflich sein können.

SELECT SUBSTRING_INDEX('Motiv-Eins (Tasse)','(',1)  

Gibt zum Beispiel nur Motiv-Eins zurück, das würde sich dann mit ein wenig tüfteln so umschreiben lassen:

SELECT DISTINCT SUBSTRING_INDEX(name,'(',1) as suppliername 
FROM s_articles
GROUP BY SUBSTRING_INDEX(name,'(',1)

Da müsstest du jetzt noch einmal schauen was du drum herum noch für Infos brauchst, die kannst du dann bei das Select schreiben.
Mit einem INSERT INTO () SELECT … kannst du das Ergebnis nicht nur ausgeben sondern auch direkt in die Tabelle schreiben lassen.

-> ICH WÜRDE HIER AUF JEDENFALL ERST IN EINER SICHERUNG DER SHOP-DB HERUMPROBIEREN

Sind die Supplier gefüllt verhält es sich im Endeffekt gleich, du machst ein JOIN von s_articles mit substring Index über den name aus suppliers und updatest die supplierID = suppliers.id

1 Like

Aah, ich sehe an deiner Antwort, ich habe mich missverständlich ausgedrückt. Also Ich brauche keinen Substring, der Artikelnmae ist nur „Motiv-Eins“,  das Wort „(Tasse)“ steht in der description. War wirklich nicht klar genug beschrieben von mir, sorry.

Ich mächte vereinfacht gesagt nur Artikelname zum Herstellernamen übernehmen, dabei Duplikate/Mehrfacheinträge vermeiden.

Im nächsten Schritt die Hersteller-ID bei den Artikeln eintragen, die den entsprechenden Namen haben.

Dann müsste das so aber eigentlich schon reichen:

INSERT INTO s_articles_supplier (name) SELECT DISTINCT name FROM s_articles GROUP BY name

 

Daraufhin dann:

UPDATE 
s_articles_supplier sas
LEFT JOIN s_articles sa ON sa.name = sas.name
SET sa.supplierID = sas.id

 

1 Like

GENIAL, hat funktioniert. Ich bin dir sehr dankbar. Kann man dir was Gutes tun? Würde mich gern erkenntlich zeigen, hast mir damit nämlich wirklich sehr weitergeholfen.