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