Flo: REPLACE und REGEX in mysql verbinden

Hallo,

ich möchte eine Textspalte in einer mysql-db updaten.

Hierzu möchte ich, falls in der Spalte vorhanden, einen Satz löschen. Dieser Satz ist immer identisch aufgebaut, nämlich nach der Art:

In diesem Spiel wurden 3 Tore erzielt

wobei die 3 natürlich je nach Anzahl erzielter Tore variiert.

Die REPLACE Funktion in mysql habe ich schon entdeckt und die würde auch helfen, wenn immer identisch viele Tore erzielt worden wären.

Spalte= REPLACE(Spalte, 'In diesem Spiel wurden 3 Tore erzielt', '')

Wie bringe ich die variable Anzahl erzielter Tore in meine Query unter?

Edit: mysql 7.4.1

Edit2: Bisher erzeuge ich mir über php eine "Queryschleife" von 0-100 Tore, die ich dann meiner Query hinzufüge und somit zwar einzeln, aber in einer Query "replace".

  1. Hallo Flo,

    In diesem Spiel wurden 3 Tore erzielt

    Wenn immer identisch ausser die Anzahl, hättest du das besser gelöst wenn du lediglich eine Spalte mit nur dem Zahlenwert genommen hättest, weil der Text bleibt ja sowieso immer gleich.

    wobei die 3 natürlich je nach Anzahl erzielter Tore variiert.

    deshalb ja.

    Wie bringe ich die variable Anzahl erzielter Tore in meine Query unter?

    Da wäre ja die Frage woher bekommst du denn den Wert der Tore?

    Gruss
    Henry

    --
    Meine Meinung zu DSGVO & Co:
    „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
    1. Hallo Henry,

      Wenn immer identisch ausser die Anzahl, hättest du das besser gelöst wenn du lediglich eine Spalte mit nur dem Zahlenwert genommen hättest, weil der Text bleibt ja sowieso immer gleich.

      Ich weiß 😉

      Flo

  2. Hallo Flo,

    MySQL 7.4? Die MySQL Doku nennt die Versionen 5.7 und 8.0. Dazwischen gibt's was?

    Aber wenn Du schon nach Regexp fragst, dann verwende doch eine.

    DELETE FROM table
    WHERE  spalte RLIKE 'In diesem Spiel wurden [0-9]+ Tore erzielt'
    

    (RLIKE oder REGEXP - die sind synonym).

    Es scheint, als ob MySQL die Angabe \d für "Ziffer" nicht verstünde. Daher [0-9], was die bekannten ASCII-Ziffern darstellt. [[:digit:]] ginge statt dessen auch.

    Und wie ich anderswo schon schrieb: Solche Texte gehören nicht in eine DB, sie gehören in die Anwendung. In die DB gehört nur eine Spalte "Tore" mit dem Wert 9 darin.

    Du hättest dann allerdings die Frage zu beantworten, wie Du deine zu löschenden Sätze findest. Für mich sieht das so aus, als wären Spiele mit diesem Eintrag solche, die beendet sind. Aber das kann natürlich auch ein Falscheindruck sein. Die Information, die Du aus der Existenz von 'In diesem Spiel wurden [0-9]+ Tore erzielt' ziehst, gehört aller Wahrscheinlichkeit nach in eine separate Spalte der Tabelle. Entweder ein Spielstatus, oder ein "erledigt" Flag.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. MySQL 7.4? Die MySQL Doku nennt die Versionen 5.7 und 8.0. Dazwischen gibt's was?

      Wo schau ich das genau nach? Ich habe in der phpinfo() nach mysql-Einträgen gesucht und stieß immer wieder auf 7.4

      Aber wenn Du schon nach Regexp fragst, dann verwende doch eine.

      DELETE FROM table
      WHERE  spalte RLIKE 'In diesem Spiel wurden [0-9]+ Tore erzielt'
      

      (RLIKE oder REGEXP - die sind synonym).

      Funktioniert das auch in Kombination mit REPLACE

      Du hättest dann allerdings die Frage zu beantworten, wie Du deine zu löschenden Sätze findest. Für mich sieht das so aus, als wären Spiele mit diesem Eintrag solche, die beendet sind. Aber das kann natürlich auch ein Falscheindruck sein. Die Information, die Du aus der Existenz von 'In diesem Spiel wurden [0-9]+ Tore erzielt' ziehst, gehört aller Wahrscheinlichkeit nach in eine separate Spalte der Tabelle. Entweder ein Spielstatus, oder ein "erledigt" Flag.

      Steht in einer seperaten Spalte. Einer Art "Bemerkungen-Spalte".

      Für mich sieht das so aus, als wären Spiele mit diesem Eintrag solche, die beendet sind.

      Du hättest Detektiv werden sollen 😀 Stimmt zwar nicht ganz, aber kommt der Sache wirklich schon sehr nah. Vermutlich hättest Du den Nagel auch auf den Kopf getroffen, wenn ich mein Originalbeispiel genommen hätte.

      Es geht schlicht darum, dass eine Tabelle in einer Boolean-Spalte upgedatet wird und im Fall 0 möchte ich einen Begleittext in der Spalte Bemerkungen ablegen (in der ggf. schon ein anderer String steht), der im Fall 1 wieder herausgelöscht werden soll (der restliche String soll aber bleiben). Dieser Begleitext ist abhängig von der Anzahl der kommaseparierten Strings in der Spalte "Tore".

      Liest sich zwar nach "von hinten durchs Knie... usw.", ist aber für ein wenig genutztes Feature ein netter und schneller Zusatz. Und zudem käme man auch ohne diesen Zusatz aus, daher möchte ich nicht zuviel hierfür ein-/umbauen.

      Flo

      1. Hallo Flo,

        Ich habe in der phpinfo() nach mysql-Einträgen gesucht und stieß immer wieder auf 7.4

        So was?

        Client API library version mysqlnd 7.4.14

        Das deutet eher darauf hin, dass Du die mysqlnd Lib von PHP 7.4 verwendest.

        Welche MYSQL Version du hast, findest Du im phpMyAdmin - oder welches Interface zur DB Du auch immer verwendest. Da gibt's (bei mir in Version 5.04) ganz oben einen Link "Server: blablabla" - also der Name des DB Servers, und wenn man da drauf klickt, bekommt man Infos zum DB Server.

        Bei mir wäre das Maria DB 10.3 - ein MySQL Klon, mit dem sich die ursprünglichen MySQL Entwickler vor Oracle geflüchtet haben.

        Funktioniert das auch in Kombination mit REPLACE

        Tjaaaa - in MYSQL 8 gibt es ein Regex-Variante von Replace REPLACE_REGEX, in 5.7 noch nicht. Maria DB kennt das ab Version 10.0.5. Was benutzt Du?

        Rolf

        --
        sumpsi - posui - obstruxi