heinetz: SELECT @c := @c + 1

Beitrag lesen

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