SQL Statement benötigt

Dimadon

Aktiver Benutzer
Beiträge
26
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....
 
Werbung:
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
 
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
 
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
 
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
 
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 :)
 
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... :)
 
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
 
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
 
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:

#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
 
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.
 
Werbung:
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?
 
Zurück
Oben