Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Statement benötigt

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Dimadon, 21 Juni 2017.

  1. Dimadon

    Dimadon Aktiver Benutzer

    Ich bräuchte mal eure Hilfe bezüglich eines SQL Statements. Folgende Infos:

    - Ich benötige ein Update if exists ansonsten ein Insert...
    - Ich habe folgende Spalten: id, msg, uid, did, success, affiliation, rate, result

    Nun benötige ich ein SQL-Statement welches erst prüft ob uid und did in Kombination bereits vorhanden ist. Wenn ja, dann Update diesen Datensatz und Erhöhung des INT-Wertes aus rate +1. Wenn bereits der Wert 4 enthalten ist soll zusätzlich in die Spalte result true geschrieben werden.

    Wenn der Datensatz in Kombination uid und did noch nicht vorhanden ist neuen Satz anlegen.

    Habe wirklich schon einige Statements getestet aber komme nicht auf die richtige Lösung. :(

    Sprache MYSQL....
     
  2. Dimadon

    Dimadon Aktiver Benutzer

    Wäre wirklich dankbar wenn jemand hier eine Idee hat die diese Anforderung löst...
     
  3. Matthi

    Matthi Benutzer

    Hi,

    ohne Garantie und Test aber ich würde so ansetzen:

    INSERT INTO Tabelle (id, msg, uid, did, success, affiliation, rate, result) VALUES (wert_1,wert_2,wert_3,wert_4,wert_5,wert_6,wert_7,wert_8) ON DUPLICATE KEY UPDATE (rate= rate+1, result = (IF((rate+1)=4),'true','') );

    So oder ähnlich...

    Grüße

    P.s.: setzt natürlich voraus, dass uid und did bei dir auch ein Key Paar in der Tabelle bilden und erkannt werden kann, dass hier ein duplicate key vorliegt
     
  4. Dimadon

    Dimadon Aktiver Benutzer

    Vielen Dank schon einmal für den Input. Habe es jetzt so Tesweise gemacht:

    Code:
    INSERT INTO testcase (`userId`, `documentId`, `msg`, `documentAffiliation`, `rate`, `favor`) VALUES ("10","12","SuccessfullFeedbackEvent") ON DUPLICATE KEY UPDATE (rate= rate+1, result = (IF((rate+1)=4),'true','') );
    Muss ich trotzdem für rate und favor ein VALUE eingeben?

    Ich bekomme den Fehler:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(rate= rate+1, result = (IF((rate+1)=4),'true','') )' at line 1
     
  5. Matthi

    Matthi Benutzer

    Sry, die Klammern hinter "...UPDATE" sind zuviel :)

    INSERT INTO testcase (`userId`, `documentId`, `msg`, `documentAffiliation`, `rate`, `favor`) VALUES ("10","12","SuccessfullFeedbackEvent") ON DUPLICATE KEY UPDATE rate= rate+1, result = (IF((rate+1)=4),'true','') ;

    So müsste es dann lauten.

    Grüße
     
  6. Dimadon

    Dimadon Aktiver Benutzer

    Die Keys habe ich gesetzt:

    Code:
    ADD UNIQUE KEY `IDCombination` (`userId`,`documentId`) USING BTREE;
     
  7. Dimadon

    Dimadon Aktiver Benutzer

    Ok neuer Fehler :) :

    Code:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '),'true','')' at line 1
     
  8. Dimadon

    Dimadon Aktiver Benutzer

    Habe mal die Hochkommas geändert und rate auch mit ' ' eingeklammert, jedoch analoger Fehler..
     
  9. Matthi

    Matthi Benutzer

    Dann müsste man mal wissen, welche Felder welche Definition haben, also ob int, varchar etc pp.

    Zudem gibst du im INSERT 6 Felder an aber nur 3 VALUES. Diese dann alle als String obwohl ich wetten würde, dass die "10" und die "12" aus den Values int-Spalten sein werden.

    Also eine Tabellenstruktur wäre halt ganz gut zu kennen :)
     
  10. Dimadon

    Dimadon Aktiver Benutzer

    Die Tabellenstruktur sieht so aus:

    Code:
      `learnerId` int(11) NOT NULL,
      `userId` int(255) NOT NULL,
      `documentId` int(255) NOT NULL,
      `msg` varchar(255) NOT NULL,
      `documentAffiliation` varchar(255) NOT NULL,
      `rate` int(11) NOT NULL,
      `favor` varchar(255) NOT NULL
    Die learnerId wird später automatisch als maxID +1 im Java-Code gesetzt, desshalb habe ich den beim Statement rausgelassen. Der Wert für rate soll immer um 1 erhöht werden wenn der Datensatz uid+did bereits existiert. Wenn nicht neuen Datensatz anlegen und rate = 1.
    Favor wie bereits beschrieben ab rate = 5 auf true setzen.

    Ich bedanke mich schonmal das du mir hier so hilfst... :)
     
  11. Matthi

    Matthi Benutzer

    Gerne und ich versuchs nochmal...


    INSERT INTO testcase (userId, documentId, msg, documentAffiliation) VALUES (10,12,"SuccessfullFeedbackEvent","Testwert") ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=4),'true','') ;


    Sag mir mal, was da jetzt rauskommt.


    Achso und wenn du bei rate = 5 ein 'true' setzen willst, muss am Ende natürlich (rate+1)=5 stehen und nicht mehr (rate+1)=4
     
  12. Dimadon

    Dimadon Aktiver Benutzer

    Wieder:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '),'true','')' at line 1
     
  13. Dimadon

    Dimadon Aktiver Benutzer

    Der gesamte Fehlertext lautet:

    Statische Analyse:

    3 Fehler wurden während der Analyse gefunden.



    1. Unerkanntes Schlüsselwort. (near "ON" at position 128)
    2. Unerkanntes Schlüsselwort. (near "DUPLICATE" at position 131)
    3. Unerkanntes Schlüsselwort. (near "KEY" at position 141)


    SQL-Befehl:

    INSERT INTO testcase (userId, documentId, msg, documentAffiliation, favor) VALUES (10,12,"SuccessfullFeedbackEvent","Testwert") ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=4),'true','')

    MySQL meldet: [​IMG]

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '),'true','')' at line 1
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=# select * from dimadon ;
     uid | did | rate | result
    -----+-----+------+--------
    (0 rows)
    
    test=# insert into dimadon (uid, did) values (1,2) on conflict (uid,did) do update set rate=coalesce(dimadon.rate,1)+1, result = case when dimadon.rate=3 then true else false end;
    INSERT 0 1
    test=# select * from dimadon ;
     uid | did | rate | result
    -----+-----+------+--------
      1 |  2 |  | f
    (1 row)
    
    test=# insert into dimadon (uid, did) values (1,2) on conflict (uid,did) do update set rate=coalesce(dimadon.rate,1)+1, result = case when dimadon.rate=3 then true else false end;
    INSERT 0 1
    test=# select * from dimadon ;
     uid | did | rate | result
    -----+-----+------+--------
      1 |  2 |  2 | f
    (1 row)
    
    test=# insert into dimadon (uid, did) values (1,2) on conflict (uid,did) do update set rate=coalesce(dimadon.rate,1)+1, result = case when dimadon.rate=3 then true else false end;
    INSERT 0 1
    test=# select * from dimadon ;
     uid | did | rate | result
    -----+-----+------+--------
      1 |  2 |  3 | f
    (1 row)
    
    test=# insert into dimadon (uid, did) values (1,2) on conflict (uid,did) do update set rate=coalesce(dimadon.rate,1)+1, result = case when dimadon.rate=3 then true else false end;
    INSERT 0 1
    test=# select * from dimadon ;
     uid | did | rate | result
    -----+-----+------+--------
      1 |  2 |  4 | t
    (1 row)
    
    test=#
    
    Wenn ich Dich richtig verstanden habe, exakt das, was Du suchst. Allerdings PostgreSQL.
     
  15. Dimadon

    Dimadon Aktiver Benutzer

    Das hört sich sehr gut an. Ich weiß bloß nicht ob ich PostgreSQL in JAVA mit GoogleCloudSQL verwenden kann? Bei deinem Beispiel oben ist mir nur nicht ganz klar wo das t am Ende herkommt?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden