[PHP] Frage zu MySQL-Abfragen

hotrs

New Member
Hi *.*.

Vorweg: Ich bin - zumindest was PHP und MySQL angeht - blutiger Anfänger und bin da gestern beim Ausprobieren auf etwas gestossen, wofür ich einfach gerne eine Erklärung hätte.
Zur Verdeutlichung folgender Code:

PHP:
  mysql_connect(...);
  mysql_select_db(...);

  $result1 = mysql_query('SELECT * FROM table1');
  $result2 = mysql_query('SELECT * FROM table2');

  while ($row1 = mysql_fetch_object($result1))
  {
    // ...

    while ($row2 = mysql_fetch_object($result2))
    {
      // ...
    }
  }

Leider verhält sich das Script nicht so, wie ich erwarten würde: Die äussere Schleife wird nur einmal durchlaufen, obwohl die Datenmenge mehr als einen Datensatz beinhalten müßte.
Stelle ich das ganze aber etwas um, so sieht es anders aus:

PHP:
  mysql_connect(...);
  mysql_select_db(...);

  $result1 = mysql_query('SELECT * FROM table1');
  
  while ($row1 = mysql_fetch_object($result1))
  {
    // ...
    $result2 = mysql_query('SELECT * FROM table2'); // !!!

    while ($row2 = mysql_fetch_object($result2))
    {
      // ...
    }
  }

Nun werden beide Schleifen so oft durchlaufen, wie ich es vermuten würde. Ich frage mich nur, WARUM das so ist und - vor allem - ist das irgendwo dokumentiert?


Grüße und danke,
hotrs
 
mysql_fetch_object nutzt einen internen Marker der das Array überschreibt. (Denk ich noch - werd halt alt.)

Ich würde das JOINEN. Das wäre dann Programmiertechnisch sauberer, performanter und und...

Gruß
 
mysql_fetch_object nutzt einen internen Marker der das Array überschreibt.

Danke für den Erklärungsversuch. Allerdings verstehe ich dadurch immer noch nicht, warum durch die blosse Umstellung auf einmal die Interation über die erste Datenmenge funktioniert.

Ich würde das JOINEN.

Ich muss für alle Datensätze der ersten Abfrage die (ggf. gefilterten) Datensätze der zweiten Abfrage auswerten. Ich denke nicht, dass ich hier mit einem JOIN auskommen werde.
Die Geschwindigkeit spielt hier eher eine untergeordnete Rolle, da es sich um eine reine Administratorfunktion handelt, welche manuel angestossen werden muss und nicht zeitkritisch ist.


Grüße,
hotrs
 
Wenn du die SQL-Abfrage für die innere Schleife außerhalb der äußeren Schleife machst, dann wird die Ergebnismenge dieser Abfrage im ersten Durchlauf der äußeren Schleife komplett durchlaufen.
Ab dem zweiten Durchlauf der äußeren Schleife sind keine Rows mehr übrig, die noch durchlaufen werden könnten.

Wenn der SQL-Code des 2. Statement nicht von Daten aus dem ersten Statement abhängt, ist es ein WTF, für jede Interation der äußeren Schleife die Daten erneut aus dem SQL-Server zu holen.

Besser ist es die Daten zu besorgen, in einem Array abzulegen und dieses per foreach zu iterieren. Das dürfte nicht nur extrem performanter sein sondern auch jede Menge Ressourcen sparen.
 
Wenn du die SQL-Abfrage für die innere Schleife außerhalb der äußeren Schleife machst, dann wird die Ergebnismenge dieser Abfrage im ersten Durchlauf der äußeren Schleife komplett durchlaufen.

Argh - das ist ja fast schon peinlich. Auf Grund des Testaufbaus - ich hatte nur eine echo-Anweisung in der inneren Schleife - war ich davon ausgegangen, das etwas beim Iterieren über die erste Ergebnismenge nicht funktioniert.

Wenn der SQL-Code des 2. Statement nicht von Daten aus dem ersten Statement abhängt, ist es ein WTF, für jede Interation der äußeren Schleife die Daten erneut aus dem SQL-Server zu holen.

Das war nur ein Testfall, der aus der Anfangszeit einer komplexeren Funktion stammte. Inzwischen wird die innere Abfrage auf Grund der äußeren Schleife gefiltert. Auf eine Zwischenspeicherung habe ich verzichtet, der Aufwand lohnt sich an dieser Stelle nicht wirklich.


Grüße,
hotrs
 
Back
Top