phpbar.de logo

Mailinglisten-Archive

[php] OT, mysql-Frage - Baum

[php] OT, mysql-Frage - Baum

Peter Linzenkirchner peter at linzenkirchner.de
Don Mai 6 17:24:21 CEST 2004


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