Simone: If Anweisung in UPDATE Mysql

HI,
Bitte helft mir auf die Sprünge ;o)

Es gibt eine Tabelle "test_it"

Updatewerte:

$insertkey ="b";
$neuanzahl ="3";

Spaltenanzahl = 3
id  | key1 | anz

Spalten Inhalt
id=1
key1 = "a,b,c"
anz = "2"

Jetzt möchte ich beim Update prüfen ob in der Spalte key1 schon mein $insertkey (b) vorhanden ist. Nur wenn er nicht vorhanden ist diese Spalte updaten die andere Spalte soll davon unberührt sein.

Also prüfe ob $insertkey (b) in key1 (a,b,c) wenn ja dann update key1

gleichzeitig update mir jedoch immer Spalte anz (anz+2)

Wie kann ich diese UPDATE Funktion formulieren?

Danke
Simone

  1. hi,

    Spaltenanzahl = 3
    id  | key1 | anz

    Spalten Inhalt
    id=1
    key1 = "a,b,c"

    Sieht so aus, als ob du nicht vernünftig normalisiert hättest - überdenke dein Datenmodell.

    Also prüfe ob $insertkey (b) in key1 (a,b,c) wenn ja dann update key1
    gleichzeitig update mir jedoch immer Spalte anz (anz+2)

    Wie kann ich diese UPDATE Funktion formulieren?

    Mit IF(), wie du schon selber schriebst.

    Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo, wahsaga

      Danke für Deine Antwort.

      Zitat: Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?

      Wenn ich die Lösung hätte würde ich mir nicht erlauben hier im Hilfe Forum eine Frage zu stellen . ;o)

      Dennoch hilft mir Deine oberflächliche Anwort nicht weiter.
      Ich bitte Dich etwas deutlicher zu werden.

      Das habe ich versucht:

      Updatewerte:

      $insertkey ="b";
      $neuanzahl ="3";

      Spaltenanzahl = 3
      id  | key1 | anz

      Spalten Inhalt
      id=1
      key1 = "a,b,c"
      anz = "2"

      UPDATE test\_it SET
      anz = '(files + ".$neuanzahl.")',
      IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
      WHERE id =1

      Simone

      1. UPDATE test\_it SET
        anz = '(files + ".$neuanzahl.")',
        IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
        WHERE id =1

        Das mit dem IF ist falsch. Einmal ist die Syntax anders als in einer normalen Programmiersprache IF( Bedingung, ergebniss_wenn_wahr, ergebniss_wenn_falsch) ausserdem solltest du das ganze mit einer einfach where Bedingung (was wohl eher einer if Anweisung entspricht) erfüllen können.

        Schematisch so:

        UPDATE .......
        WHERE FIND_IN_SET(wert, feld) > 0 AND ID = .....

        Struppi.

        1. Hallo Struppi

          Danke für Deine Antwort!

          UPDATE .......
          WHERE FIND_IN_SET(wert, feld) > 0 AND ID = .....
          So hatte ich es auch schon probiert das geht natürlich

          Zu mein Problem:

          Ich möchte beim Update prüfen ob in der Spalte key1 schon mein $insertkey (b) vorhanden ist. Nur wenn er nicht vorhanden ist diese Spalte updaten
          die anderen Spalten (updates) soll davon unberührt sein.

          was mit dieser Abfrage nicht durchführbar scheint
          WHERE FIND_IN_SET(wert, feld)

          Simone

      2. hi,

        Zitat: Hast du das mal im Manual deines Datenbanksystems nachgeschlagen?

        Wenn ich die Lösung hätte würde ich mir nicht erlauben hier im Hilfe Forum eine Frage zu stellen . ;o)

        Das war keine Antwort auf meine Frage.

        Dennoch hilft mir Deine oberflächliche Anwort nicht weiter.

        Deine "oberflächliche" Art, eine Problemlösung zu suchen, hilft auch nicht weiter.

        Ich bitte Dich etwas deutlicher zu werden.

        Also gut:

        Liebe Simone,
        hast du, da du ja IF() in einer MySQL-Query zu verwenden gedenkst, dir im Manual schon mal angesehen, wie die Syntax dieser Anweisung in MySQL aussieht.
        Falls ja, was hast du herausgefunden?; Falls Nein, dann sei doch bitte so lieb, dies jetzt nachzuholen.

        Das habe ich versucht:

        Und was kam dabei heraus?
        (Sag jetzt bitte nicht "funk´tioniert nicht".)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. hi,

          Sag jetzt bitte nicht "funk´tioniert nicht..

          Doch, es funktioniert

          Durch die Hilfe von Menschen die helfen und sich nicht über die Unwissenheit anderer belustigen PUNKT

          Simone

          1. Durch die Hilfe von Menschen die helfen und sich nicht über die Unwissenheit anderer belustigen PUNKT

            Du hast nicht verstanden worum es bei SELFhtml und eben auch im Forum geht. Keiner macht sich Lustig über jemanden, sondern dir wurde mehrfach versucht zu helfen, in dem dir gesagt wird, wo du das Nachlesen kannst was dir hilft.

            Das nächste Problem ist sicher nicht weit und es ist doch sicher auch für dich befriedigender selbst das Problem zu lösen, als jedesmal anderen erst das Problem begreiflich machen zu müssen, um zu hoffen das jemand sich, mit einer für dich funktionierenden Lösung, erbarmt.

            Also was hilft dir mehr - Mitleid, weil jemand merkt das du nicht Willens bist die Dokumentaiton zu lesen oder Hilfe zur Selbsthilfe?

            Struppi.

      3. Hallo

        UPDATE test\_it SET
        anz = '(files + ".$neuanzahl.")',
        IF(FIND_IN_SET('$endung', key1) > 0, key1 = CONCAT_WS(',',key1,'".$insertkey."'))
        WHERE id =1

        IF führt in einer Query nichts aus, sondern liefert etwas zurück.

        IF(1<2,'yes','no') liefert also "yes" zurück. http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html

        IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b')) liefert also entweder den key1 oder die Verkettung zurück, je nachdem, ob (FIND_IN_SET('b', key1) > 0) wahr oder falsch ist.

        Nun muss man das Ergebnis von IF nur noch in den UPDATE-Query einbauen:

        UPDATE test_it SET
        anz = (files + 3),
        key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
        WHERE id =1

        viele Grüße

        Axel

        1. Hallo Axel

          Ich danke Dir ganz lieb.!!

          Es gibt also doch noch Menschen hier im Forum die nicht nur Sprüche ablassen können sondern durch Ihr Wissen glänzen.

          Danke Simone

        2. Nun muss man das Ergebnis von IF nur noch in den UPDATE-Query einbauen:

          UPDATE test_it SET
          anz = (files + 3),
          key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
          WHERE id =1

          Spricht eigentlich was dagegen, einfach in allen Datensätzen das Feld zu updaten?
          Das spart das if statement.

          UPDATE test_it SET  
          anz = (files + 3),  
          key1 = CONCAT_WS(',',key1,'b')  
          WHERE id =1
          

          oder erzeugt das einen Fehler, wenn das Bit schon gesetzt ist?

          Struppi.

          1. Hallo,

            UPDATE test_it SET
            anz = (files + 3),
            key1 = IF(FIND_IN_SET('b', key1) > 0, key1, CONCAT_WS(',',key1,'b'))
            WHERE id =1

            Spricht eigentlich was dagegen, einfach in allen Datensätzen das Feld zu updaten?
            Das spart das if statement.

            UPDATE test_it SET

            anz = (files + 3),
            key1 = CONCAT_WS(',',key1,'b')
            WHERE id =1

            Nein, das würde ja bei  
              
            id  key1  anz  
            1   a,b   1  
              
            dann  
              
            id  key1   anz  
            1   a,b,b  4  
              
            ergeben. (btw.: die Spalte files habe ich gedanklich mit der Spalte anz gleichgesetzt, weil ich sonst nicht wüsste, wo sie plötzlich herkommt.)  
              
            Wenn ich es richtig verstanden habe, wollte sie folgendes erreichen:  
              
            id  key1  anz  
            1   a     1  
              
            UPDATE test\_it SET  
            anz = (anz + 3),  
            key1 = IF(FIND\_IN\_SET('b', key1) > 0, key1, CONCAT\_WS(',',key1,'b'))  
            WHERE id =1  
              
            ergibt  
              
            id  key1  anz  
            1   a,b   4  
              
            UPDATE test\_it SET  
            anz = (anz + 3),  
            key1 = IF(FIND\_IN\_SET('b', key1) > 0, key1, CONCAT\_WS(',',key1,'b'))  
            WHERE id =1  
              
            ergibt  
              
            id  key1  anz  
            1   a,b   7  
              
            also: Die Spalte anz wird immer geupdatet, die Spalte key1 aber nur dann, wenn der entsprechende Buchstabe nicht schon in der Liste steht.  
              
            viele Grüße  
              
            Axel
            
            1. Nein, das würde ja bei

              id  key1  anz
              1   a,b   1

              dann

              id  key1   anz
              1   a,b,b  4

              ergeben. (btw.: die Spalte files habe ich gedanklich mit der Spalte anz gleichgesetzt, weil ich sonst nicht wüsste, wo sie plötzlich herkommt.)

              Das stimmt nicht. Das Set Feld, kann einen Wert immer nur einmal haben.

              Vorhin hatte ich keine Möglichkeit das zu testen, mein Vorschlag geht ohne Probleme.

                
              CREATE TABLE `tipps` (  
                `test` set('0','1','-1') NOT NULL default ''  
              ) ;  
              
              -- 
              -- Daten für Tabelle `tipps`  
              --  
                
              INSERT INTO `tipps` VALUES ('0,-1');  
              INSERT INTO `tipps` VALUES ('0,-1');  
              INSERT INTO `tipps` VALUES ('0,1,-1');  
              INSERT INTO `tipps` VALUES ('-1');  
              INSERT INTO `tipps` VALUES ('1,-1');  
              INSERT INTO `tipps` VALUES ('0,-1');  
              INSERT INTO `tipps` VALUES ('1,-1');  
              INSERT INTO `tipps` VALUES ('-1');
              

              und dann

              UPDATE tipps SET test = CONCAT_WS(',', test, '-1')  WHERE 1

              Macht genau das richtige.

              also: Die Spalte anz wird immer geupdatet, die Spalte key1 aber nur dann, wenn der entsprechende Buchstabe nicht schon in der Liste steht.

              Das stimmt ja, aber das IF ist überflüssig ob es die Abfrage wirklich langsamer macht habe ich jetzt nicht getestet.

              Struppi.
              --
              Javascript ist toll

              1. Hallo,

                mein Vorschlag geht ohne Probleme.

                CREATE TABLE tipps (
                  test set('0','1','-1') NOT NULL default ''
                ) ;

                Ja, unter der Voraussetzung, key1 würde vom Datentyp SET sein, würde Dein Vorschlag funktionieren ;-).

                viele Grüße

                Axel

                1. mein Vorschlag geht ohne Probleme.

                  CREATE TABLE tipps (
                    test set('0','1','-1') NOT NULL default ''
                  ) ;

                  Ja, unter der Voraussetzung, key1 würde vom Datentyp SET sein, würde Dein Vorschlag funktionieren ;-).

                  Funktioniert find_in_set auch auf andere Felder?

                  Struppi.

                  1. echo $begrüßung;

                    Funktioniert find_in_set auch auf andere Felder?

                    Wer weiß ...?

                    echo "$verabschiedung $name";

                  2. Hello,

                    Funktioniert find_in_set auch auf andere Felder?

                    Das ist eine "ganz normale spezielle Stringfunktion" *g*

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

              2. Hello Struppi,

                Dein Posting bring meine ganze benutzerdefinierte Anzeige durcheinander.
                Da sind die nachfolgenden Threads plötzlich alle als gelesen markiert, obwohl ich sie noch gar nicht gelesen habe. Wenn ich dann auf das Nachfolgeposting gehe, ist alles wieder OK

                Was hast Du da eingebaut?
                Muss aber dann wohl ein Fehler des Forums sein, oder?

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Dein Posting bring meine ganze benutzerdefinierte Anzeige durcheinander.
                  Da sind die nachfolgenden Threads plötzlich alle als gelesen markiert, obwohl ich sie noch gar nicht gelesen habe. Wenn ich dann auf das Nachfolgeposting gehe, ist alles wieder OK

                  Was hast Du da eingebaut?

                  Ich? Gar nichts!

                  Muss aber dann wohl ein Fehler des Forums sein, oder?

                  Eben, frag hier einen Admin.

                  Struppi.

                2. hi,

                  Was hast Du da eingebaut?

                  Im SQL-Code stand mehrmals die Sequenz für den Beginn der Signatur.
                  (Ist doch aber langsam schon ein alter Hut ...)

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Was hast Du da eingebaut?

                    Im SQL-Code stand mehrmals die Sequenz für den Beginn der Signatur.
                    (Ist doch aber langsam schon ein alter Hut ...)

                    Zuhause mit dem Firefox hatte ich das gar nicht gesehen, das sind SQL Kommentare die phpmyadmin beim exportieren einbaut.

                    Hab ich noch nicht vorher hier gesehen (ich schau mir auch selten die DB Threads an).

                    Struppi.

  2. yo,

    die lösung für dein UPDATE-befehl wurde ja bereits gefunden. allerdings will ich noch mal auf den anderen rat von wahsaga eingehen, der ein wenig untergegangen ist, da es sich lohnt, den hinweis zu verfolgen.

    dein daten-design entspricht nicht der 1. Normallform, sprich du rufst mit hilfe von mysql funktionen teile eines einzelnen tabellen-feldes auf. damit liegt deine tabelle nicht in atomarer form vor.

    das ist nicht grundsätzlich falsch, aber man sollte dann auch genau wissen, welche vorteile und welche nachteile das hat. eine folge von nachteilen zum beispiel ist eben dein update befehl. der würde wesentlich einfacher ausfallen, wenn die tabellen in atomarer form vorliegen würde.

    Ilja

  3. Hello,

    Bitte helft mir auf die Sprünge ;o)

    Vielleicht hilft Dir dieser Thread https://forum.selfhtml.org/?t=126807&m=818034 ?

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau