Mailinglisten-Archive |
Hallo Sebastian, Am 6. Mai 2004 um 13:20 schrieb Sebastian Mendel: Sorry, dass ich so oft nachhake, aber obwohl es mein Problem immer noch nicht genau trifft, lerne ich immens an dieser Diskussion. >> den Inhalt des gleichen Feldes über zwei Zeilen [tauschen]: >> zeile1, feld1='x' >> zeile2, feld1='y' >> soll werden zu: >> zeile1, feld1='y' >> zeile2, feld1='x' > > na du musst schauen welcher Wert in den beiden betreffenden Zeilen > gleich ist und anhand diesen wertes die Tabelle mit sich selber Joinen > in einem UPDATE Leider ist kein Wert gleich. Es handelt sich um einen Baum (damit beschäftige ich mich im Moment eigentllich - verknotet regelrecht das Gehirn :-): id name vater_id 5 A 1 6 B 5 7 C 6 8 D 7 9 E 8 10 F 9 11 G 10 12 H 11 13 I 12 C und G tauschen die Plätze Mein Ansatz: 1. über die ids von C und G die Söhne suchen: D und H 2. die vater_ids der beiden Söhne tauschen: D bekommt 11 und H bekommt 7 3. die vater_ids der beiden Väter tauschen: C bekommt 10 und G bekommt 6 ergibt: id name vater_id 5 A 1 6 B 5 11 G 6 8 D 11 9 E 8 10 F 9 7 C 10 12 H 77 13 I 12 Das bedeutet einen Austausch der vater_id bei jeweils zwei Datensätzen. Keiner der Werte ist gleich und kann damit auch nicht als Schlüssel für einen Join verwendet werden (zumindest soweit ich das mit meinen rudimentären Kenntnissen verstehe). (Das Problem würde auch auftreten, wenn ich ein eigenes Feld zum Sortieren einführe - dann müsste eben der Sortierwert ausgetauscht werden) > UPDATE table1, table1 AS table2 > SET table1.feld1 = table2.feld2 > WHERE table1.id = [id] > AND table2.id = [id] Ein Alias, um in einer Tabelle von einem Datensatz in den anderen zu kopieren. Schön, hätte ich schon öfter brauchen können :-) Aber hier reicht es nicht, da ich so die Daten von G nach C bringe, aber nicht die von C nach G. Und das geht nicht: UPDATE table1, table1 AS table2 SET table1. vater_id = table2. vater_id SET table2. vater_id = table1. vater_id <= WHERE table1.id = [7] AND table2.id = [11] => so würde ich nur den neuen Wert, den ich eben von G nach C kopiert habe wieder nach G zurückkopieren, anstatt den alten Wert. Also vielleicht mit einer Hilfstabelle: UPDATE table1, table1 AS table2, table3 SET table3.temp = table1. vater_id SET table1. vater_id = table2. vater_id SET table2. vater_id = table3.temp WHERE table1.id = [7] AND table2.id = [11] AND table3.id = [1] Ich werde es jedenfalls mal ausprobieren. Im Moment quäle ich mich noch durch die Theorie - versuche einfach rauszubekommen, wie man einigermaßen effizient in einer Vater-Sohn Struktur Datensätze tauscht, Zweige umhängt etc. Vielleicht ist mein Ansatz natürlich ganz falsch. Vielleicht wäre es besser, den betroffenen Zweig ganz in ein PHP-Array zu schreiben, das Array zu manipulieren und dann zurückzuspeichern. Ich werde beide Ansätze mal ausprobieren. Vielen Dank Peter -- ---------------------------------------------------------------- Peter Linzenkirchner Lisardo Multimedia GmbH Herrenbachstraße 19, 86161 Augsburg Tel. ++49-821-150565, Fax ++49-821-150595 ----------------------------------------------------------------
php::bar PHP Wiki - Listenarchive