Hallo Forum,
ich habe mal für ein Skript nach einer Möglichkeit gesucht,
eine Spalte neu durchzunummerieren und eine ganz elegante
Lösung per SQL gefunden. Das ging so:
SET @c := -1;
UPDATE `structure` SET `d3` = ( SELECT @c := @c + 1 )
ORDER BY `id`;
Jetzt benötige ich wieder so etwas. Allerdings ist die
Numerierung etwas komplizierter. So sieht meine Tabelle
im Prinzip aus:
id | d0 | d1 | d2 | d3 |
--------|----|----|----|----|
1 | 0 | 0 | 0 | 0 |
--------|----|----|----|----|
2 | 0 | 1 | 0 | 0 |
--------|----|----|----|----|
3 | 0 | 1 | 1 | 0 |
--------|----|----|----|----|
4 | 0 | 1 | 1 | 1 |
--------|----|----|----|----|
5 | 0 | 1 | 1 | 2 |
--------|----|----|----|----|
6 | 0 | 1 | 1 | 3 |
--------|----|----|----|----|
7 | 0 | 1 | 2 | 0 |
--------|----|----|----|----|
8 | 0 | 1 | 2 | 1 |
--------|----|----|----|----|
9 | 0 | 1 | 2 | 3 |
--------|----|----|----|----|
10 | 0 | 1 | 2 | 4 |
Eines Vorab:
------------
Die Struktur an sich soll nicht verändert werden und
daher ist eine Diskussion über Sinn oder Unsinn dieses
DB-Layouts überflüssig. Mir ist bewusst, dass man das
anders hätte machen können und wohl auch sollen.
Aber zu den Inhalten:
---------------------
Die Felder d0-d3 stellen Ebenen einer Baumstruktur dar.
Der Wert 0 zeichnet einen Datensatz als Elternelement
aus. Sehen wir uns nur die 'Blätter' also die letzte Ebene
an. Dann ist der Datensatz id=3 Elternelement von 4,5 und
6 und der Datensatz id=7 Elternelement von 8, 9 und 10.
Die Reihenfolge der Kinder von id=3 (4, 5 und 6) ergibt
sich aus deren Werte in d3 also 1, 2, 3.
Die Nummerierung in den Beispieldaten ist zur Zeit korrekt.
Jetzt will ich aber Datensatz id=5 löschen. Dadurch entsteht
eine Lücke und die Nummerierung der verbleibenden Kinder von
id=3 (4 und 6) ist 1, 3.
Mit der SQL-Lösung oben könnte ich die Daten sortieren:
... ORDER BY d0, d1, d2, d3
... den zuvor festgelegten Zähler:
SET @c := -1;
bei jedem Datensatz im 1 hochzählen:
SELECT @c := @c + 1
... und so die gesammte Tabelle im Feld d3 neu durchnummerieren.
Was mir nicht klar ist, ist wie ich dafür sorge, dass immer wenn
in d3 der Wert 0 steht der Zähler wieder auf 0 gesetz wird.
Ich glaube, die Logik ist klar, mir fehlt nur die Systax.
Kann mir dabei jemand helfen ?
danke und beste gruesse,
heinetz