2 Stimmen

Multiplizieren ersetzen in MySQL Update-Abfrage mit Join-Tabelle

Ich habe einige Tabellen:

#comments
| id| text     |
----------------
| 1 | aa bb cc |

#words
| id| word |
------------
| 1 | aa   |
| 2 | bb   |

Dann führe ich diese Abfrage aus

UPDATE comments AS c
        LEFT JOIN
    words AS w ON (c.text LIKE CONCAT('%', w.word, '%')) 
SET 
    c.text = REPLACE(
        c.text,
        w.word,
        CONCAT('', w.word, '')
    )

Als Ergebnis habe ich diese Daten in der Kommentare-Tabelle

| id| text            |
-----------------------
| 1 | aa bb cc |

Wie ändere ich meine Abfrage, um in Ergebnis etwas wie das zu bekommen?

| id| text                   |
------------------------------
| 1 | aa bb cc |

1voto

Gordon Linoff Punkte 1198148

Dies ist etwas zu lang für einen Kommentar.

Die einfache Antwort lautet, dass Sie mit einem einzigen MySQL update Befehl nicht das gewünschte Ergebnis erzielen können. Sie haben eine Situation, in der mehrere Zeilen in der Tabelle #words einer bestimmten Zeile in der Tabelle #comments entsprechen. Was passiert, wird in der Dokumentation erklärt:

Für die Syntax mit mehreren Tabellen aktualisiert UPDATE Zeilen in jeder Tabelle, die in table_references genannt wird und die Bedingungen erfüllen. Jede übereinstimmende Zeile wird nur einmal aktualisiert, auch wenn sie mehrfach den Bedingungen entspricht.

In einigen Datenbanken kann dies mit rekursiven CTEs erreicht werden. Und es könnte möglich sein, wenn Sie eine Funktion für die Ersetzung von regulären Ausdrücken hätten. Aber beides sind keine Optionen in MySQL.

Das lässt Ihnen zwei Möglichkeiten. Die erste ist, eine gespeicherte Prozedur zu schreiben und das update in einer Schleife auszuführen. Die zweite ist, Ihre Datenstruktur zu ändern, sodass Sie keine Listen von Dingen in einem String speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X