Hallo,
ich habe ein „Portierungsproblem“ meiner MySQL-Datenbank, bei der mir hoffentlich jemand weiterhelfen kann
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
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
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