heinetz: PHP-Login / MySQL-Statement

Beitrag lesen

Hallo Forum,

um ein MySQL-Update auszuführen, habe ich eine PHP-Logik gebaut.
Da ich das heute mehr oder minder unelegant gelöst finde, würde
ich gerne versuchen, die PHP-Logik zu erssetzen und alle in
einem MySQL-Statement abzubilden. Vielleicht mag mir jemand dabei
helfen.

Zwei Tabellen. Die erste heisst 'content':

site_id |    title |
----------|----------|
        1 |  string1 |
----------|----------|
        2 |  string2 |
----------|----------|
        3 |  string3 |
----------|----------|
        4 |  string4 |
----------|----------|
        5 |  string5 |
----------|----------|
        6 |  string6 |

Die zweite heisst 'structure':

site_id | d0 | d1 | d2 | d3 |                          titles |
--------|----|----|----|----|---------------------------------|
      1 |  1 |  0 |  0 |  0 |                        string1/ |
--------|----|----|----|----|---------------------------------|
      2 |  1 |  1 |  0 |  0 |                 string1/string2/|
--------|----|----|----|----|---------------------------------|
      3 |  1 |  1 |  1 |  0 |        string1/string2/string3/ |
--------|----|----|----|----|---------------------------------|
      4 |  1 |  1 |  1 |  1 | string1/string2/string3/string4 |
--------|----|----|----|----|---------------------------------|
      5 |  2 |  0 |  0 |  0 |                         string5/|
--------|----|----|----|----|---------------------------------|
      6 |  2 |  1 |  0 |  0 |                  string5/string6|

Das Feld structure.titles wird in der gesamten Tabelle
structure upgedatet. Schritt für Schritt in PHP sieht
das so aus:

$SelStatment1 = '  
SELECT * FROM `structure`';  
  
$SelResult1   = mysql_query($SelStatment1);  
while ($row1 = mysql_fetch_assoc($SelResult1))  
     {  
      $SelStatment2 = '  
      SELECT  
      content.title FROM content  
      JOIN structure  
      ON content.site_id = structure.site_id  
      WHERE  
      (  
       (  
        structure.d0 = '.$row1['d0'].' AND  
        structure.d1 = 0 AND  
        structure.d2 = 0 AND  
        structure.d3 = 0  
       )  
       OR  
       (  
        structure.d0 = '.$row1['d0'].' AND  
        structure.d1 = '.$row1['d1'].' AND  
        structure.d2 = 0 AND  
        structure.d3 = 0  
       )  
       OR  
       (  
        structure.d0 = '.$row1['d0'].' AND  
        structure.d1 = '.$row1['d1'].' AND  
        structure.d2 = '.$row1['d2'].' AND  
        structure.d3 = 0  
       )  
       OR  
       (  
        structure.d0 = '.$row1['d0'].' AND  
        structure.d1 = '.$row1['d1'].' AND  
        structure.d2 = '.$row1['d2'].' AND  
        structure.d3 = '.$row1['d3'].'  
       )  
      )  
      ORDER BY  
      structure.d0,  
      structure.d1,  
      structure.d2,  
      structure.d3';  
  
      $SelResult2   = mysql_query($SelStatment2);  
      $titles = '';  
      while ($row2 = mysql_fetch_assoc($SelResult2))  
           {  
            $titles.= $row2['title']."/";  
           }  
      $UpdStatment3 = '  
      UPDATE structure  
      SET titles = "'.$titles.'"  
      WHERE site_id = '.$row1['site_id'];  
  
      $SelResult3   = mysql_query($UpdStatment3);  
     }

Ich hoffe aus dem PHP-Code und den MySQL-Tabellen wird die
Logik einigermassen klar. Das PHP ist ohne Rücksicht auf
Performace programmiert. In den beiden Tabellen gibt es
mittlerweile mehr als 1000 Datensätze. Das heisst, dass
meine Schleife 1000 Mal durchläuft, was 2000 SQL-Statements
bedeutet.

Ich kann mir vorstellen, dass ich das genauso mit einem
entsprechend geschachtelten MySQL-Statement hinbekommen
kann, bin aber gestern erstmal mit foldendem ersten Versuch
gescheitert:

UPDATE structure SET `titles` = (  
SELECT title  
FROM content  
WHERE (  
SELECT "X"  
FROM structure  
)  
)  

Das "X" ist natürlich Quatsch, aber scheitern tut das nicht
daran sondern daran, dass in der Bedingung die selbe Tabelle
verwenden will, die ich update.

#1093 - You can't specify target table 'structure' for update in FROM clause

Geht das, was ich hier vorhabe?

danke für eine Einschätzung und

beste gruesse,
heinetz