Schleifen in SQL?

2 Antworten

Vorausgesetzt ich verstehe dich richtig und deine Tabelle sieht etwa so aus:

CREATE TABLE `namen` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45),
`code` varchar(45),
PRIMARY KEY (`ID`)
);

dann solltest du hiermit zum Ziel kommen:


SELECT
if(name != @temp , @rownum := 1, @rownum := @rownum + 1) AS nm,
@temp := name AS temp,
name,
code,
concat(name, '_', @rownum)
FROM (SELECT @rownum := 0) AS ROWNUM, namen
ORDER BY name;

Ich ermittle alle Datensätze der Tabelle und sortiere nach Namen, jetzt bilden alle Datensätze mit gleichen Namen einen Block. Die Variable rownum wird einfach bei jedem Datensatz hochgezählt, aber nur, wenn sich der Namen ändert, sonst wieder auf 1 zurück gesetzt. Daher speichere ich auch den gerade ermittelten Namen in der Variablen temp zwischen.

Naja und concat setzt dir einfach den Namen neu zusammen, so wie du es beschrieben hast.



ich wusste gar nicht, dass SQL sölche konstrukte zulässt aber man lernt nie aus. DH

1

Frag mich jetzt nicht wie aber vielleicht hilft ein Group by. Wie man die Zahl anhängen kann weiss ich auch nicht.

GROUP BY war zwar auch mein erster Gedanke, aber das geht nicht, weil sie ja alle Datensätze pro Gruppierung braucht und in die View schreiben will. 

Die Zahl oder was auch immer kann einfach mit CONCAT() angehängt werden. Das Problem ist eher die Numerierung pro gleichen Namen zu ermitteln. 

1
@seidlerweb

Ein Group by geht schon. Du müsstest nur zwei Querys daraus machen. Einer, der die Zahl ermittelt, einer der alle Werte zurück liefert und ein kleines Script, welches ein Objekt daraus aufbaut.

2

Was möchtest Du wissen?