Zwei Datenbanktabellen zusammenfassen

Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 10:32:16 von Ingo Kolb

Hallo zusammen,
Google konnte mir leider nicht wirklich helfen, lag aber wahrscheinlich eher
an meinen Suchbegriffen :(

Ich habe hier zwei MySQL-Datenbanken. Der Einsatzzweck ist der Selbe,
programmiert wurden sie aber von unterschiedlichen Personen. Demnach habe
ich nun in der einen Tabelle mehr Felder, in der Anderen ein paar weniger,
die Feldtypen sind z.T. anders, die Feldnamen auch etc. In beiden DB stehen
natürlich schon Daten drin. Aus der einen DB werden aber nicht alle
Felder/Daten benötigt.
Gibt es eine Möglichkeit die Datenbanktabellen zusammenzufassen? Die
FeldINHALTE sollten dies zulassen.

Laienhaft stelle ich mir ein Tool vor, in dem ich die eine Datenbanktabelle
angebe, dann die Andere und das Tool mich nun fragt, welches Feld zu welchem
analog ist. Anschließend dann einfach alle Werte aus Tabelle1 in Tabelle2
packt (oder auch gern eine neue Tabelle3 erstellt)

Folgende Felder sollten übetragen werden:

Tabelle1 Tabelle2

Zeit (datetime) DATUM (date) //Quasi aus 1 mach 2
Zeit (datetime) UHRZEIT (time) //Quasi aus 1 mach 2
Name (varchar) Nachname (varchar)
Vorname (varchar) Nachname (varchar)
Geschlecht (char) Geschlecht (char)
Jahrgang (smallint) Geburtsjahr (varchar)
Strasse (varchar) Anschrift (varchar)
PLZ (varchar) PLZ (varchar)
Ort (varchar) Ort (varchar)
Telefon (varchar) Telefon (varchar)
Email (varchar) Emailadresse (varchar)
Verein (varchar) Verein (varchar)
Strecke (varchar) Wettbewerb_Auswahl (char) //Zeichenlänge ist kein
Problem
Kontoinhaber (varchar) Kontoinhaber (varchar)
BLZ (varchar) Bankleitzahl (varchar)
KontoNr (varchar) Kontonummer (varchar)
TShirt (varchar) Funktionsshirt (varchar)
TShirtSize (varchar) Shirtgroesse (varchar)
PassNr (varchar) Passnr (varchar)

Leider arbeite ich noch nicht so lange mit PHP & MySQL. Als Tool steht mir
PHPMyAdmin zur Verfügung (dass ich aber auch noch am entdecken bin ;))

Grüße,
Ingo

--
Die E-Mailadresse ist gültig, wird aber nicht gelesen.
This e-mailadress is valid but won't be read.

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 15:36:01 von Johannes Vogel

Hi Ingo

Ingo Kolb wrote:
> Ich habe hier zwei MySQL-Datenbanken. Der Einsatzzweck ist der Selbe,
> programmiert wurden sie aber von unterschiedlichen Personen. Demnach habe
> ich nun in der einen Tabelle mehr Felder, in der Anderen ein paar weniger,
> die Feldtypen sind z.T. anders, die Feldnamen auch etc. In beiden DB stehen
> natürlich schon Daten drin. Aus der einen DB werden aber nicht alle
> Felder/Daten benötigt.
> Gibt es eine Möglichkeit die Datenbanktabellen zusammenzufassen? Die
> FeldINHALTE sollten dies zulassen.
> Laienhaft stelle ich mir ein Tool vor, in dem ich die eine Datenbanktabelle
> angebe, dann die Andere und das Tool mich nun fragt, welches Feld zu welchem
> analog ist. Anschließend dann einfach alle Werte aus Tabelle1 in Tabelle2
> packt (oder auch gern eine neue Tabelle3 erstellt)

Ich empfehle dir, von beiden Datenbanken einen Dump zu ziehen und diesen
dann von Hand in einem Text-Editor zusammenzufügen. Dann kannst du das
Ergebnis wieder in eine dritte einpflegen.

Etwas allgemeines gibt's wohl hier kaum und wäre m.E. auch nicht
wirklich praktikabel. Um wieviele Datensätze handelt es sich denn in etwa?

> Folgende Felder sollten übetragen werden:
> Tabelle1 Tabelle2
> Zeit (datetime) DATUM (date) //Quasi aus 1 mach 2
> Zeit (datetime) UHRZEIT (time) //Quasi aus 1 mach 2

Zeit (datetime) ist zu empfehlen

> Name (varchar) Nachname (varchar)
> Vorname (varchar) Nachname (varchar)

Hier meinst du wohl auch rechts Vorname

> Geschlecht (char) Geschlecht (char)
> Jahrgang (smallint) Geburtsjahr (varchar)

Der Jahrgang kann gut als smallint abgelegt werden.
Oder besser: Geburtsdatum als date.

> Strasse (varchar) Anschrift (varchar)
> PLZ (varchar) PLZ (varchar)
> Ort (varchar) Ort (varchar)
> Telefon (varchar) Telefon (varchar)
> Email (varchar) Emailadresse (varchar)
> Verein (varchar) Verein (varchar)

Normalisiere: Man könnte in mehr als einem Verein tätig sein.

> Strecke (varchar) Wettbewerb_Auswahl (char) //Zeichenlänge ist kein

Normalisiere...

> Problem
> Kontoinhaber (varchar) Kontoinhaber (varchar)
> BLZ (varchar) Bankleitzahl (varchar)
> KontoNr (varchar) Kontonummer (varchar)
> TShirt (varchar) Funktionsshirt (varchar)

Normalisiere...

> TShirtSize (varchar) Shirtgroesse (varchar)
> PassNr (varchar) Passnr (varchar)

> Leider arbeite ich noch nicht so lange mit PHP & MySQL. Als Tool steht mir
> PHPMyAdmin zur Verfügung (dass ich aber auch noch am entdecken bin ;))

Macht nichts.. :-)
HTH, Johannes

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 15:53:20 von Ingo Kolb

Johannes Vogel wrote:
> Ich empfehle dir, von beiden Datenbanken einen Dump zu ziehen und
> diesen dann von Hand in einem Text-Editor zusammenzufügen. Dann
> kannst du das Ergebnis wieder in eine dritte einpflegen.

Das hatte ich mir auch schon überlegt, dachte aber, es gibt da vielleicht
eine elegantere Möglichkeit.

> Etwas allgemeines gibt's wohl hier kaum und wäre m.E. auch nicht
> wirklich praktikabel. Um wieviele Datensätze handelt es sich denn in
> etwa?

In der Tabelle sind es knapp 700 Datensätze, in der Tabelle2 knapp 100.
Allerdings soll die Tabelle2 weiterverwendet werden.

>> Folgende Felder sollten übetragen werden:
>> Tabelle1 Tabelle2
>> Zeit (datetime) DATUM (date) //Quasi aus 1 mach 2
>> Zeit (datetime) UHRZEIT (time) //Quasi aus 1 mach 2
>
> Zeit (datetime) ist zu empfehlen

Warum? Ich fand die bisherige Lösung geschickt, um den benötigten Wert
"direkter" zu haben.

>> Name (varchar) Nachname (varchar)
>> Vorname (varchar) Nachname (varchar)
>
> Hier meinst du wohl auch rechts Vorname

Ups, ja.

>> Geschlecht (char) Geschlecht (char)
>> Jahrgang (smallint) Geburtsjahr (varchar)
>
> Der Jahrgang kann gut als smallint abgelegt werden.
> Oder besser: Geburtsdatum als date.

Ok, mit dem smallint hast Du Recht. Werde ich umstellen. Als date möchte ich
das aber nicht ablegen, da ich später eine kleine Rechnung mit dem
Geburtsjahr mache. Und da habe ich dann gleich das Jahr ohne noch irgendwas
wegschneiden o.ä. zu müssen. Aber vielleicht denke ich da noch zu
umständlich ;-)

>> Strasse (varchar) Anschrift (varchar)
>> PLZ (varchar) PLZ (varchar)
>> Ort (varchar) Ort (varchar)
>> Telefon (varchar) Telefon (varchar)
>> Email (varchar) Emailadresse (varchar)
>> Verein (varchar) Verein (varchar)
>
> Normalisiere: Man könnte in mehr als einem Verein tätig sein.

Richtig, das ist hier aber nicht relevant. Es geht darum, für welchen Verein
ein Sportler startet.

>> Strecke (varchar) Wettbewerb_Auswahl (char) //Zeichenlänge ist
>> kein
>
> Normalisiere...

Nö :-) Es gibt nur eine Strecke, da die Wettbewerbe parallel laufen ;-)

>> Kontoinhaber (varchar) Kontoinhaber (varchar)
>> BLZ (varchar) Bankleitzahl (varchar)
>> KontoNr (varchar) Kontonummer (varchar)
>> TShirt (varchar) Funktionsshirt (varchar)
>
> Normalisiere...

Was? Wie?

> Macht nichts.. :-)

Schön :-)

Grüße,
Ingo

--
Die E-Mailadresse ist gültig, wird aber nicht gelesen.
This e-mailadress is valid but won't be read.

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 16:14:39 von Johannes Vogel

Hi Ingo

Ingo Kolb wrote:
> Johannes Vogel wrote:
>> Ich empfehle dir, von beiden Datenbanken einen Dump zu ziehen und
>> diesen dann von Hand in einem Text-Editor zusammenzufügen. Dann
>> kannst du das Ergebnis wieder in eine dritte einpflegen.
> Das hatte ich mir auch schon überlegt, dachte aber, es gibt da vielleicht
> eine elegantere Möglichkeit.

Noch eleganter? :-)
Du könntest natürlich die Queries so absetzen, dass du genau das drüben
hast, was du willst...

insert into tabelle2 (....) select (....) from tabelle1;

und dann im nachhinein geeignet filtern.

>>> Folgende Felder sollten übetragen werden:
>>> Tabelle1 Tabelle2
>>> Zeit (datetime) DATUM (date) //Quasi aus 1 mach 2
>>> Zeit (datetime) UHRZEIT (time) //Quasi aus 1 mach 2
>> Zeit (datetime) ist zu empfehlen
> Warum? Ich fand die bisherige Lösung geschickt, um den benötigten Wert
> "direkter" zu haben.

Du solltest das Datum der DB geeignet ablegen und dann später mittels
DB-Funktionen die gewünschten Infos saugen. Die DB wird dir das abnehmen.

>>> Geschlecht (char) Geschlecht (char)

Übrigens: Sobald du varchar() benutzt, ist die Tabelle dynamisch, also
sind alle char sofort varchar().

>>> Jahrgang (smallint) Geburtsjahr (varchar)
>> Der Jahrgang kann gut als smallint abgelegt werden.
>> Oder besser: Geburtsdatum als date.
> Ok, mit dem smallint hast Du Recht. Werde ich umstellen. Als date möchte ich
> das aber nicht ablegen, da ich später eine kleine Rechnung mit dem
> Geburtsjahr mache. Und da habe ich dann gleich das Jahr ohne noch irgendwas
> wegschneiden o.ä. zu müssen. Aber vielleicht denke ich da noch zu
> umständlich ;-)

Überlass Datumsrechnungen immer der DB. Das gibt sonst immer
komplizierte Probleme (Schaltjahre, verschiedenlange Monate etc.). Jetzt
in diesem Fall wirst du Glück haben und es kommt nicht so drauf an.

>>> Strasse (varchar) Anschrift (varchar)
>>> PLZ (varchar) PLZ (varchar)
>>> Ort (varchar) Ort (varchar)
>>> Telefon (varchar) Telefon (varchar)
>>> Email (varchar) Emailadresse (varchar)
>>> Verein (varchar) Verein (varchar)
>> Normalisiere: Man könnte in mehr als einem Verein tätig sein.
> Richtig, das ist hier aber nicht relevant. Es geht darum, für welchen Verein
> ein Sportler startet.

Er könnte in Zukunft den Verein wechseln.

>>> Strecke (varchar) Wettbewerb_Auswahl (char) //Zeichenlänge ist
>>> kein
>> Normalisiere...
> Nö :-) Es gibt nur eine Strecke, da die Wettbewerbe parallel laufen ;-)

Heute schon, was ist morgen?

>>> Kontoinhaber (varchar) Kontoinhaber (varchar)
>>> BLZ (varchar) Bankleitzahl (varchar)
>>> KontoNr (varchar) Kontonummer (varchar)
>>> TShirt (varchar) Funktionsshirt (varchar)
>> Normalisiere...
> Was? Wie?

Naja, anscheinend suchst du nur eine Tabellenkalkulation, statt einer
DB. Tshirt gibt's ja wohl in 3, 4 Typen. Also macht man eine Tabelle, wo
alle Tschirttypen drin stehen und referenziert zu dieser. Dasselbe
übrigens auch bei Ortschaften, etc. Oder aber man nimmt eine
Tabellenkalkulation und macht's da flach in einer Tabelle.

HTH, Johannes

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 16:28:05 von Axel Schwenke

"Ingo Kolb" wrote:
>
> Ich habe hier zwei MySQL-Datenbanken. Der Einsatzzweck ist der Selbe,
> programmiert wurden sie aber von unterschiedlichen Personen. Demnach habe
> ich nun in der einen Tabelle mehr Felder, in der Anderen ein paar weniger,
> die Feldtypen sind z.T. anders, die Feldnamen auch etc. In beiden DB stehen
> natürlich schon Daten drin. Aus der einen DB werden aber nicht alle
> Felder/Daten benötigt.
> Gibt es eine Möglichkeit die Datenbanktabellen zusammenzufassen?

Soll das einmalig geschehen oder sollen das getrennte Tabellen bleiben?
Im ersten Fall würde INSERT INTO tbl1 (c1, c2) SELECT c3, c4 FROM tbl2
helfen; das Mapping der Spalten müßtest du natürlich von Hand machen.
Und natürlich müßtest du dir überlegen, was mit Duplikaten geschehen
soll. Für den zweiten Fall gibt es
SELECT ... FROM tbl1 UNION SELECT ... FROM tbl2

Details verrät dir das freundliche MySQL-Manual unter dev.mysql.com/doc

> Laienhaft stelle ich mir ein Tool vor

Das Tool nennt man gemeinhin "Gehirn" und es steckt in dem runden Ding
über deinem Hals.


XL

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 16:55:13 von Ingo Kolb

Johannes Vogel wrote:
> Du solltest das Datum der DB geeignet ablegen und dann später mittels
> DB-Funktionen die gewünschten Infos saugen. Die DB wird dir das
> abnehmen.

Aha, muss ich mich mal schlau machen.

> Überlass Datumsrechnungen immer der DB. Das gibt sonst immer
> komplizierte Probleme (Schaltjahre, verschiedenlange Monate etc.).
> Jetzt in diesem Fall wirst du Glück haben und es kommt nicht so drauf
> an.

Aha, muss ich mich... siehe oben ;)

>> Richtig, das ist hier aber nicht relevant. Es geht darum, für
>> welchen Verein ein Sportler startet.
>
> Er könnte in Zukunft den Verein wechseln.

Und auch das ist egal ;) Es geht hier um einen Wettbewerb, der einmal im
Jahr stattfindet. Da sich die Teilnehmer fürs nächste Jahr sowieso wieder
neu anmelden müssen, können sie dann ja den neuen Verein angeben.

> Heute schon, was ist morgen?

siehe oben. Jedes Jahr eine neue Anmeldung.

> Naja, anscheinend suchst du nur eine Tabellenkalkulation, statt einer
> DB. Tshirt gibt's ja wohl in 3, 4 Typen. Also macht man eine Tabelle,
> wo alle Tschirttypen drin stehen und referenziert zu dieser. Dasselbe
> übrigens auch bei Ortschaften, etc. Oder aber man nimmt eine
> Tabellenkalkulation und macht's da flach in einer Tabelle.

Du hast im Prinzip Recht. Eigentlich ist das Teil nicht mehr als eine
Tabellenkalkulation im Web. Das ist schon richtig. Es geht eigentlich nur
darum, für jeden Teilnehmer eine Zeile zu haben. Und da steht eben irgendwo
drin, ob er ein T-Shirt will und -wenn ja- die passende Größe.

Grüße,
Ingo

--
Die E-Mailadresse ist gültig, wird aber nicht gelesen.
This e-mailadress is valid but won't be read.

Re: Zwei Datenbanktabellen zusammenfassen

am 24.04.2006 16:57:24 von Ingo Kolb

Axel Schwenke wrote:
> Soll das einmalig geschehen oder sollen das getrennte Tabellen
> bleiben? Im ersten Fall würde INSERT INTO tbl1 (c1, c2) SELECT c3, c4
> FROM tbl2 helfen; das Mapping der Spalten müßtest du natürlich von
> Hand machen. Und natürlich müßtest du dir überlegen, was mit
> Duplikaten geschehen soll. Für den zweiten Fall gibt es
> SELECT ... FROM tbl1 UNION SELECT ... FROM tbl2

Ja, einmalig. Ich werde die erste Variante mal testen.

> Das Tool nennt man gemeinhin "Gehirn" und es steckt in dem runden Ding
> über deinem Hals.

Hm, hab ich schonmal davon gehört... Unter welcher Lizenz steht denn das? ;)

Ok ok, habs ja kapiert. Ich werde mal testen.

Danke und Grüße,
Ingo

--
Die E-Mailadresse ist gültig, wird aber nicht gelesen.
This e-mailadress is valid but won't be read.