MySQL - Daten aus zwei Tabellen zusammenführen

Hallo,

ich habe ein „Portierungsproblem“ meiner MySQL-Datenbank, bei der mir hoffentlich jemand weiterhelfen kann :slight_smile:

Folgende Problemsituation: Ich habe ein Zeitschriftenarchiv, dessen Datensätze ich in einer Datenbank ablege und per PHP in einem Skript auslese.

Anfangs habe ich mir über eine saubere Datenbankstruktur leider keine Gedanken gemacht und alles in einer einzigen Tabelle abgespeichert. Dies wird mir nun zum Verhängnis…

Das bedeutet:

Tabelle: „zeitschriften_alt“

  • id
  • Zeitschriftenname
  • Ausgabennummer
  • Erscheinungsdatum
  • Format
  • Seitenzahl
  • etc.

Nicht ganz ohne Redundanzen, da bei jedem neuen Heft-Eintrag beispielsweise auch immer der Zeitschriftenname miteingetragen werden muss und hierüber eine, meiner Ansicht nach, unsaubere Selektion erfolgt. Auch weitere, statische Angaben, werden mit jedem neuen Eintrag wieder erneut eingetragen.

In der Zwischenzeit kam meinerseits der Wunsch auf, das Archiv zu erweitern, indem ich Informationen zu jeder einzelnen Zeitschrift bereitstelle. Hierfür habe ich jetzt eine neue Tabelle („zeitschriften“) erstellt, welche für jede Zeitschrift einen neuen Eintrag erhält. Kurz gesagt: Zeitschriften sind eine eigene Tabelle („zeitschriften“), Ausgaben eine andere Tabelle („ausgaben“).

Das Problem, vor dem ich nun stehe, ist, wie ich nun sauber die Daten aus der einen Ursprungstabelle („zeitschriften_alt“) in die neuen zwei aufgeteilten Tabellen („zeitschriften“ / „ausgaben“) kopiere?

Die Zeitschriften-Tabelle war für mich problemlos machbar - ich habe alle Zeitschriften-Datensätze gruppiert und somit einmalig in die neue Tabelle eingetragen (der Primärschlüssel „id“ sollte nicht mitübertragen sondern automatisch neu fortlaufend vergeben werden, deshalb wurde dies im Befehl nicht implementiert):

INSERT INTO zeitschriften (zeitschrift, land, erscheinungsweise)

SELECT zeitschrift, land, erscheinungsweise

FROM zeitschriften_alt GROUP BY zeitschrift

Bedauerlicherweise kann es vorkommen, dass es z.B. in Deutschland und Schweiz eine Zeitschrift mit den exakt selben Namen existiert - dies wurde in meinem SQL-Befehl nicht berücksichtigt. Ich hätte nicht nur nach ‚zeitschrift‘ gruppieren dürfen sondern hätte abweichende Länder mitberücksichtigen müssen. Da es sich hierbei aber nur um knappe 10 Einträge handelte, konnte ich das problemlos händisch nachtragen.

Bei den Ausgaben ist es aber jetzt weit umfangreicher, da inzwischen über 3.000 Eintragungen vorliegen und in die neue Tabelle („ausgaben“) ja für die Zuordnung nicht mehr der Zeitschriftenname sondern die ‚id‘ aus der Tabelle „zeitschriften“ eingetragen werden soll.

Folglich muss ich beim kopieren der Datensätze aus der alten Tabelle auch die id des jeweiligen Datensatzes aus der neuen Zeitschriften-Tabelle abfragen - bloß wie?

Ich versuche mich seit Stunden mit JOIN und lese viel aber komme kein Stück voran.

Meine Frage deshalb: Geht das so einfach überhaupt direkt in der Datenbank? Oder muss ich einen umständlichen Weg über ein PHP-Skript gehen, indem ich die Einträge nacheinander auslese und dann entsprechend eintrage? Dies würde ich, verständlicherweise, gerne vermeiden :wink:

Konkret sollte das ganze also wie folgt geschehen:

  • Feld ‚id‘, ‚ausgabennummer‘, ‚erscheinungsdatum‘, ‚format‘, ‚seitenanzahl‘ aus Tabelle „zeitschriften_alt“ in die gleichnamigen Felder in der neuen Tabelle „ausgaben“ eintragen

sowie:

  • das Feld ‚id‘ aus der neuen Tabelle „zeitschriften“, bei dem zeitschriften.zeitschrift = zeitschriften_alt.zeitschrift && zeitschriften.land = zeitschriften_alt.land zutrifft in das Feld „zeitschrift“ der neuen Tabelle „ausgaben“ eintragen

Hat mir hier jemand einen Rat, wie ich das bewerkstelligen kann? Letztendlich soll das ganze ja in einem Befehl erfolgen bei dem jedoch gleichzeitig ein Feld aus einer anderen Tabelle entnommen wird, welches jedoch in Abhängigkeit einer Bedingung steht.

Möglicherweise ist das ganze auch recht simpel und ich habe mich nur etwas verrannt. Dann wäre ich über etwas Erleuchtung sehr dankbar :wink:

Wie man am Umfang meines Beitrages erkennen kann, mache ich mir das ganze nicht ganz einfach sondern versuche selbst eine praktikable Lösung zu finden - aber leider gelingt es mir nicht :-/

Besten Dank im Voraus fürs lesen und evt. die ein oder andere Hilfestellung :-))

Viele Grüße

Hi,

ich vermute, du hast so gar keine Ahnung vom Datenbankentwurf, ist meine Annahme richtig? Ich hätte nämlich sonst erstmal ein ER-Modell gemacht, wie es aussehen soll, und dann geschaut, wo habe ich die Daten in der alten Datenbank, und wohin müssen sie in die neue übertragen werden.

Wenn, dann wäre der Weg nicht umständlicher, sondern deutlich effektiver als alles per Hand einzutragen. :smiley:

Gruß
Christa

1 Like

Hallo Christa,

erst mal Danke für deine Rückmeldung. Der Entwurf ist eigentlich in dem Sinne keiner mehr - die Tabellen existieren bereits. Ich muss nur jetzt die Inhalte der alten Tabelle auf die neuen beiden Tabellen aufteilen, wobei der erste Teil bereits erfolgreich abgeschlossen ist. Nur am zweiten haperts noch.

Dass ein PHP-Skript zur Lösung die bessere Variante ist als alles händisch einzutragen, ist mir auch klar. Dennoch wäre es direkt in SQL noch simpler statt ein entsprechendes PHP-Skript zu schreiben.

Daher meine Frage: Geht das von mir beabsichtigte in dieser Form überhaupt oder muss ich den Weg über PHP gehen?

Vielen Dank!

Das ist mir klar. Aber vielleicht sind die so, wie du sie angelegt hast, auch nicht sinnvoll (vielleicht aber doch!), deswegen wäre eine grafische Darstellung erstmal besser, um sich über die Beziehungen klar zu werden.

Es ist zwar gut, dass du dir die Mühe gemacht hast, um alles so genau wie möglich zu beschreiben, aber bei dem vielen Text muss man immer hin und her scrollen, um zu sehen, wo was genau ist.

Schreib dann wenigstens alles einmal vollständig auf, ohne „etc.“ :slight_smile: Dann die neuen Tabellen, ebenfalls vollständig, und falls die Attribute anders heißen, irgendwie noch in Klammern (ist Attribut x aus der Tabelle y).

Also, die alte Tabelle Zeitschriften hat folgende Spalten

(bitte ergänzen, was fehlt).

Die neue Tabelle Zeitschriften hat folgende Spalten:
id (Primärschlüssel, aber neu vergeben)
zeitschriftenname
land
erscheinungsweise

Die neue Tabelle Ausgabe hat folgende Spalten:
ausgabe_id (vermutlich, ebenfalls als Primärschlüssel)

id (Fremdschlüssel aus der neuen Tabelle Zeitschriften).

Bitte vervollständigen. :slight_smile:

1 Like