# Möglichkeiten um Tabelleninhalte von einer zur anderen Tabelle zu transferieren



## SantaCruze (1. Februar 2007)

Hallo mal wieder  Und zwar habe ich folgendes vor, um Ressourcen zu sparen will ich (es geht um eine Statistik Berechnung) einen Inhalt von mehreren Tabellen in eine einzige transferieren mittels Cronjob. Nun ist folgendes Problem , und zwar ich weiß nicht wie.

Ein Script was die Tabelle leert ist klar, aber wie setze ich es um, das ich z.b. angeben will "Lese den Wert xyz aus Tabelle a aus, den Wert zyx aus Tabelle b und füge beide Werte in Tabelle C ein". Sprich sozusagen die Inhalte hin und herschieben in einer Datenbank.

Das ganze soll zum Zweck haben, das sich die Statistik z.b. nur 5x am Tag aktualisiert und nicht bei jedem User Zugriff, da ich sonst etwas bedenken habe das der Server das lange mitmachen würde.


----------



## Sturmrider (1. Februar 2007)

Hi 
Ich hätte da einen einfacheren Vorschlag, der die Datenbank etwas mehr schont 
lege doch einfach eine neue Spalte in deiner Statistik-Tabelle an wo du das Datum (den timestamp) reinschreibst, wann der Eintrag das letzte Mal erstellt wurde. Wenn dieser timestamp ein gewisses Datum übersteigt, soll einfach eine neue erstellt (oder die Alte überschrieben) werden. Du kannst natürlich auch beim Überschreiten des Timestamps den Eintrag in eine neue Tabelle kopieren und in der Alten löschen.
Den timespamp würde ich in SQL in etwa so prüfen: 

```
$verfallszeit = 60*60*24*5; /*also in diesem Fall 5Tage*/
...
mysql_query("SELECT ... WHERE (erstellungsZeit+". $verfallszeit ." < '". time() ."')");
```


----------



## SantaCruze (2. Februar 2007)

Nein das Problem ist, das ich zwar eine Statistik habe, die nach Punkten sortiert ist, ich aber eine weitere Statistik erstellen will wo ganz andere Daten verarbeitet werden, aus mehreren Tabellen raus. Und da würde ich dann ja gleichzeitig wieder zig Querys laufen haben. Daher die Frage wie man aus vielen Tabellen einen Wert in eine einzige Tabelle übertragen kann.


----------



## Sturmrider (2. Februar 2007)

Erlichgesagt verstehe ich dein Problem nicht vollständig. Was meinst du mit z.B."nach Punkten geordnet"?
Was dein Problem mit den zig Querys betrifft, ist mir keine Methode bekannt, mit der man mehrere Tabellenabfragen in einen query packen kann 
Ich würde bei wirklich vielen abfragen die SQL-Befehle in einen Array schreiben und diesen in einer Schleife nach und nach mit einem query abarbeiten.
Sry, dass ich dir nicht wirklich weiterhelfen konnte, vielleicht wissen die Anderen noch eine Lösung dein Problem betreffend (ich informiere mich auch noch einmal  ->interessiert mich)


----------



## Andi1982 (2. Februar 2007)

Hi,
wenn deine Statistiktabelle in etwa so aussieht:
z.B.:
Kdnr
Name
Str
Artikelnr
Artikeltext
Waehrung
Netto
Brutto

und deine Quelltabellen:

Auftrag:
Kdnr
Artikelnr
Artikeltext
Waehrung
Datum
Netto
Brutto

Kunde:
Kdnr
Name
Str

Dann kann der Insert so aussehen:

```
Insert into Statistiktabelle(Kdnr
                            ,Name
                            ,Str
                            ,Artikelnr
                            ,Artikeltext
                            ,Waehrung
                            ,Datum
                            ,Netto
                            ,Brutto)
                      select a.Kdnr
                           , a.Name
                           , a.Str
                           , b.Artikelnr
                           , b.Artikeltext
                           , b.Waehrung
                           , b.Datum
                           , b.Netto
                           , b.Brutto
                        from Kunde a
                           , Auftrag b
                       where Datum > [Zeitpunkt der letzten Aktualisierung]
                         and a.Kdnr = b.Kdnr;
```

So sollte es funktionieren.


----------



## SantaCruze (3. Februar 2007)

Ich glaube ich drücke mich echt etwas undeutlich aus. Also, ich will ein Script schreiben, was alle Statistischen Daten fest für einen Zeitraum in einer Tabelle speichert.

Daher das Script läuft z.b. alle 2 Stunden, selektiert aus 10 Tabellen verschiedene Daten (z.b. Punkte des Besten Spielers , Anzahl der Gebäude usw.) und speichert die fest in einer neuen Tabelle ab. Nach den 2 Stunden geht das Script wieder durch die Tabellen, greift sic hdie höchsten Werte raus und speichert sie wieder in einer seperaten Tabelle ab.

Nur das Problem ist, wie mache ich das? Auslesen ist klar, aber wie sage ich dem script dann , transferiere folgende Werte in eine neue Tabelle ?


----------



## Andi1982 (4. Februar 2007)

warum willst du immer eine neue tabelle anlegen? verpass deiner zieltabelle eine fortlaufende id mit ner sequenz drauf oder alternativ mach einen timestamp zum pk.

oder wenn du wirklich eine neue tabelle erzeugen willst, dann kannst du es auch wie folgt machen:

```
create table ".$tab_name." as 
                      select a.Kdnr
                           , a.Name
                           , a.Str
                           , b.Artikelnr
                           , b.Artikeltext
                           , b.Waehrung
                           , b.Datum
                           , b.Netto
                           , b.Brutto
                        from Kunde a
                           , Auftrag b
                       where Datum > [Zeitpunkt der letzten Aktualisierung]
                         and a.Kdnr = b.Kdnr;
```

aber davon würde ich wirklich abraten, man sollte sich gerade bei einem relationalen dbms ein vernünftiges datenmodell ausdenken. in dem wust aus ca 84 neuen tabellen pro woche kennst sich bald keiner mehr aus. geschweige dessen sind es ja gar nicht so viele daten.


----------

