Mysql - jeden 3. Wert ansprechen

webguru2009

Mitglied
Hallo,

ich habe den befehl:

PHP:
UPDATE content SET text = replace(text, 'ä', 'ae');

Dieser sorgt dafür das er aus einem "ä" Umlaut ein "ae" macht.
Wie kann ich aber immer nur den 3. Wert ansprechen?

Er soll also nur den Umlaut bei jeden 3ten Wert ersetzen.
Ist das möglich?

Mfg Webguru
 
Zuletzt bearbeitet:
Wenn du eine Spalte mit einer fortlaufenden id hast, könntest du die Teilbarkeit von 3 prüfen.
 
Mein 1. beitrag war falsch.
Es solle nicht in jeder 3. Zeile ersetzt werden sondern schon jeder 3. Wert.

Also ich habe einen Satz wo 6 mal ä darin vorkommt, dann soll es bei dem 3 und 6 Wert den
Umlaut ersetzen aber bei den anderen nicht.
 
Du kannst eine RowNum mitgeben und prüfen ob sie durch 3 Teilbar ist.
Konstruct für RowNum
SQL:
SELECT
    @rownum:=@rownum+1 AS rownum,
    t.*
FROM
    (SELECT @rownum:=0) AS vars,
    TABLE AS t

Also in etwa so könnte es gehen (ist nicht getestet!)
SQL:
UPDATE 
	content 
SET text = replace(text, 'ä', 'ae');  
WHERE id IN
	(SELECT
		a.id
	FROM
		(SELECT
		    @rownum:=@rownum+1 AS rownum,
		    t.id
		FROM
		    (SELECT @rownum:=0) AS vars,
		    content AS t) AS a
	WHERE MOD(a.rownum, 3) = 0)
 
Zuletzt bearbeitet von einem Moderator:
Dieser Code funktioniert aber dauert eine Ewigkeit.

Code:
UPDATE content SET text =  REPLACE( text, 'ä', 'ae' ) WHERE id IN (
SELECT a.id
FROM (

SELECT @rownum := @rownum +1 AS rownum, t.id
FROM (

SELECT @rownum :=0
) AS vars, content AS t
) AS a
WHERE MOD( a.rownum, 3 ) =0
);

Die Datenbank ist sehr groß. (700 mb)

Gibt es eventuell eine elgantere, Resourcen schonende Variante?
Trotzdem schoneinmal vielen Dank für die Hilfe.

Mfg Webguru
 
Zuletzt bearbeitet:
Ich versteh zwar absolut nicht wozu man sowas brauchen kann...
Gibt es keine weiteren Eingrenzungen?
Hast du ein Sinnvollen Index?

REPLACE() selber ist schon Langsam auf viele Zeilen. Der wird auf 1 Drittel der Zeilen angewendet. MOD() wird auf jede Zeile Angewendet. Das kannbei grösseren Datenmengen ausbremsen.
 
Das Problem bei dem Befehl ist, dass mein Frontent nicht funktioniert,
während es durchläuft. (Serverlast)

Mache ich nur:

Code:
UPDATE content SET text = replace(text, 'ä', 'ae');
Dann ist es innerhalb Sekunden da, aber es muss ja auch nicht berechnen oder zählen.

Ich habe einen Primärschlüssel (ID) aber ich glaube es gibt nicht viel mehr als RowNum oder?
 
Mir kommt grad nix anderes in den Sinn.

1) Wozu braucht man denn sowas? Also dass man nur jeden dritten Eintrag ändern muss?
Ev. finden wir auch etwas wenn wir ide ganze Abfrage hinterffragen.

2) Arbeitet du mit PHP?
 
1) Wozu braucht man denn sowas? Also dass man nur jeden dritten Eintrag ändern muss?

Es sind insgesamt 3 Systeme und ich bin mittedrin :)
Eines überträgt Daten als SQL direkt in meine Datenbank.

Die Daten werden bei mir gespeichert und dann sollen viele Wörter geändert
werden und dannach weiter verschickt. es werden z.b.: viele Buchstaben zu Zahlen aber die Tabellen bleiben alle gleich.

2) Arbeitet du mit PHP?

Mein System basiert auf Joomla und ich arbeite mit PHP.
Ich habe mich auch schon Wundgesucht aber mir fällt absolut nichts mehr ein.

Mfg Webguru
 
gefährlich.
Du leist jetzt einfach systematisch jede dritte Zeile aus. Die Zeilen sind in der Reihenfolge wie sie geschrieben wurde oder wie MySQL sie gerade leifern will. Es ist überhaubt nicht garantiert, dass die Reihenfolge immer gleich bleibt und dass jede 3te Zeile die gesuchte ist.

Darum: Mach es nicht so!

Hast du kein Feld das dir die Quelle der Zeile Angiebt? Wenn ja, setzt du beser da drauf ein Filter
 
Zurück