Vinzenz Mai: JOIN einsetzen statt mit PHP nachzubauen

Beitrag lesen

Hallo Ingrid,

Ein INNER JOIN sollte den PHP-Code drastisch reduzieren und die Performance deutlich verbessern.

Um es ein wenig zu demonstrieren:

sqla =  "SELECT  
           kd_id, akt_art, akt_betrag, akt_bem, akt_bez  
           FROM aktion_bew  
           WHERE kd_id = '$kunde_id'  
    ORDER BY akt_art";  
  
$upx = 0;  
$rNachlass = 0;  
  
$sqlb = "SELECT id, par_bez, par_wert1, par_wert2, par_wert3, par_wert4  
         FROM param  
         WHERE par_bez='Nachlass'  
         ORDER BY par_bez";  
  
$result = mysql_query($sqla) OR die(mysql_error());  
while($row = mysql_fetch_assoc($result)) {  
    if ( $row['akt_bez'] == 'Nachlass' ) {  
        //...  
        while($rowb = mysql_fetch_assoc($resultb)) {  
            // ...  
            if  ($row['akt_art'] == $rowb['par_wert1'] ) {  
                // Mache was;  
            }  
            // kein else-Zweig  
        }  
    }  
    // kein else-Zweig  
}  
while ( $upx != 0 ) {  
    $resultup = mysql_query($queryup[$upx]) OR die(mysql_error());  
    $upx = $upx - 1;  
    ;  // Huch, ein leeres Statement :-)  
}  

Du fügst Deinem Array mit UPDATE-Statements nur dann einen neuen Eintrag hinzu, wenn

a) im Feld akt_bez der Wert 'Nachlass' steht
b) die Werte der Felder 'akt_art' in Tabelle aktion_bew und
   'par_wert1' in Tabelle param gleich sind.

Alle anderen Datensätze interessieren Dich nicht.
Weiterhin greifst Du nur auf Inhalte der Spalten

a) par_wert1
b) par_wert4

zu, falls ich nichts übersehen habe. Die Inhalte der anderen Spalten müssten nicht angefordert werden.

Also verwende von vornherein das SQL-Statement

  
SELECT  
    p.par_wert1,  
    p.par_wert4  
FROM aktion_bew a  -- ein Aliasname erspart uns Schreibarbeit  
INNER JOIN param p ON a.akt_art = p.par_wert1  
WHERE a.kd_id = <die Kundenid aus der Variablen>  
   AND p.par_bez = 'Nachlass'  
   AND a.akt_bez = 'Nachlass'  
ORDER BY a.akt_art, p.par_bez

Durchlaufe die Ergebnismenge und stelle Dein Array zusammen :-)

$upx = 0;  
$rNachlass = 0;  // Wo benutzt Du diese Variable?  
  
$sql = <obiges Statement>  
// Hmm, nicht gerade die schönste Fehlerbehandlung,  
// das Skript einfach sterben zu lassen  
$result = mysql_query($sqla) OR die(mysql_error());  
while($row = mysql_fetch_assoc($result)) {  
    // Baue die Update-Statements zusammen  
    $upx=$upx+1;  
  
    // Hast Du hier die Probleme?  
    // Ich verstehe jedenfalls nicht, was Du hier vorhast  
  
    $querybetrag= "\$Feld" .  $row['par_wert4'];  
    $querybem = "\$Bem" .  $row['par_wert4'];  
    $queryart =$row['par_wert1'];  
  
    $queryup[$upx]=  "UPDATE aktion_bew  
                      SET akt_betrag = '$querybetrag',  
                          akt_bem = '$querybem'  
                      WHERE  akt_art = '$queryart'  
                      AND kd_id = '$kunde_id' ;";  
    // Anmerkung: Warum das Semikolon am Ende des Statements  
}  
// Führe die Update-Statements aus  
// Hast Du schon einmal von [link:http://de2.php.net/manual/de/control-structures.foreach.php@title=foreach] gehört  
// - hier in Kombination mit [link:http://de2.php.net/manual/de/function.array-reverse.php@title=array_reverse()]?  
while ( $upx != 0 ) {  
    $resultup = mysql_query($queryup[$upx]) OR die(mysql_error());  
    $upx = $upx - 1;  
}  

Wie bereits gesagt, ist mir völlig schleierhaft, wie Deine UPDATE-Statements aussehen sollten - und wo Dein ursprüngliches Problem genau beheimatet ist. Nähere Informationen mit ein paar Beispieldaten wären sicherlich nützlich.

Freundliche Grüße

Vinzenz