Aquariohile: -> MySQL -> Ganzen Table einlesen, teile davon ausgeben?

Hallo Leute

Klaus Mock hat mir heute schon mal im Forum erklärt wie ich einen Table 1 mal einließt,
und in einer schleife ausgibt zeilenweise.

Aber:
Nun habe ich mir überlegt,
ob es auch so herum gehen würde,
dass man einen Table hat,
zu beispiel diesen hier:

+----+----------+-------------+
| id | name     | adresse     |
+----+----------+-------------+
|  1 | Sabine   | Wiesenweg 3 |
|  2 | Bernhard | Waldgasse 7 |
|  3 | Andreas  | Hochweg 19  |
+----+----------+-------------+

und den als gesamtheit 1x einließt,
und dann teilwerte wiedergibt, wie z.B. in einem Text.

Beispiel:

-----------
Die Freundin meines Kollegen "Bernhard" heißt "Sabine",
sie wohnt im "Wiesenweg 3", Bernhard aber in der "Waldgasse 7"
Sein bester Freund aus dem "Hochweg 19" heißt "Andreas".
-----------

Dieses Beispiel ist zugegebener maßen doof,
was ich aber damit meine ist,
dass man im Text ganz wild gewürfelt auf den Table zugreift und daten herausnimmt,

Frage:

Geht obiges Beispiel mit nur _Einem_ Database zugriff?
Dass ich praktisch ein mal den Table einlese,
und dann irgendwie (array?) die Daten ausgeben kann,
ohne für jeden wert wieder auf die DB zuzugreifen???

Sorry für diese Art von Fragen,
aber solche Praxisbveispiele helfen mir unheimlich das abzuchecken....

Danke
Aquariophile

  1. Hallo Aqua,
    du kannst, nachdem du die ganzen Zeilen in ein (möglicherweise mehrdimensionales) Array eingelesen hast,  mit den Zeileninhalten machen was du willst. Das hat mit MySQL gar nix mehr zu tun.
    MfG
    Moldawian

  2. Hallo,

    Nun habe ich mir überlegt,
    dass man einen Table hat,
    und den als gesamtheit 1x einließt,
    und dann teilwerte wiedergibt, wie z.B. in einem Text.

    Du kannst z.B. mein Beispiel so modifizieren

    my $ids = join(',',@ids);

    my $sth = $dbh->prepare("SELECT * FROM table");
    $sth->execute;
    my @werte;
    my @tabelleninhalt
    while(@werte = $sth->fetchrow_array)
      {
      push @tabelleninhalt, [@werte];
      }

    Damit kriegst Du eine Liste von Listen, die den ganzen Tabelleninhalt gespeichert hält.

    Für solche Fälle gibts sogar eine eigene Funktion

    my $tabelleninhalt = $sth->fetchall_arrayref;
    Achtung: $tabelleninhalt ist dann eine Referenz auf eine Liste.

    Wie man mit Referenzen bzw. Listen von Listen umgeht findest Du unter

    perldoc perllol
    perldoc perldsc
    und
    perldoc perlreftut

    Aber bitte sei gewarnt. Das kann auch ganz schön ins Auge gehen. Wenn Du nämlich eine große Tabelle, mit vielen Datensätzen, in ihrer Gesamtheit in den Speicher wuchtest, dann kann der Speicherbedarf immens werden, da Perl allein schon für die interne Verwaltung solcher verschachtelten Listen einiges braucht.
    Also nur mit bedacht darauf zurückgreifen.

    Wichtig ist außerdem, daß Du bei den Abfragen nur die Felder bzw nur die Datensätze zurückgeben läßt, welche unbedingt vonnöten sind. Das obige Beispiel ist in diesem Zusammenhang ziemlich unglücklich gewählt.
    Erstens verwende ich anstelle expliziter Feldangaben '*', was bedeutet, daß immer alle Felder gelesen werden, egal ob ich sie nun brauche oder nicht.
    Zweitens wird aus mangel einer Einschränkung die ganze Tabelle abgefragt. Das ist zwar nicht immer zu vermeiden. Ich habe aber schon oft gesehen, daß von der Datenbank alle Datensätze abgeholt werden, und im Programm dann die notwendigen aussortiert werden, obwohl das mit einer WHERE-Klausel genausogut machbar wäre.

    Grundlegendes Ziel sollte also sein, beide Systeme, die Datenbank und das Perlscript, oder auch andere Programme, so gering wie notwendig zu belasten.

    Ich hoffe, dich wieder einen Schritt weiter gebracht zu haben.

    Grüße
      Klaus