# SQL Statement gesucht...



## Dimadon (20. Jun 2017)

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....


----------



## Dukel (20. Jun 2017)

https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html


----------



## Dimadon (20. Jun 2017)

Danke, jedoch habe ich das schon probiert..Irgendwie klappt das bei mir nicht.


----------



## Robat (20. Jun 2017)

Dimadon hat gesagt.:


> Irgendwie klappt das bei mir nicht.


Geht das noch ein wenig genauer?


----------



## Dimadon (20. Jun 2017)

```
Wenn ich es so mache:

INSERT INTO learnerTest (`msg`,`userId`,`documentId`,`affiliation`,) VALUES (test,10,12,true)
  ON DUPLICATE KEY UPDATE `rate`=`rate`+1;
```

Bekomme ich in meiner Testumgebung den Fehler:

3 Fehler wurden während der Analyse gefunden.


Unerkanntes Schlüsselwort. (near "ON" at position 125)
Unerkanntes Schlüsselwort. (near "DUPLICATE" at position 128)
Unerkanntes Schlüsselwort. (near "KEY" at position 138)
Ich nutze PHP-MyAdmin local zum Test. Produktiv wird es auf Google Cloud SQL herauslaufen. Liegt es an meiner Testumgebung?


----------



## Thallius (20. Jun 2017)

Ich sehe zumindest schon mal ein Komma das da nicht hingehört. Ob das das Problem ist kann ich aber jetzt hier auf der Couch nicht sagen 

Weithin musst du auf den entsprechenden Feldern natürlich auch einen primary key setzen.


----------



## Dimadon (20. Jun 2017)

Ok Komma klar...ich glaube das ON DUPLICATE KEY UPDATE funktioniert bei mir nicht...


----------



## Thallius (20. Jun 2017)

Dann wärst du aber der erste auf der Welt


----------



## Thallius (20. Jun 2017)

Schreib mal alles in eine Zeile nur zum testen


----------



## Dukel (20. Jun 2017)

Hast du evtl. eine zu alte MySql Version?
Geht es mit einem normalen MySql Client und nicht via PhpMyadmin?
Hast du es mal mit einer ganz einfachen Test-Tabelle (z.B. mit nur zwei Spalten) versucht?


----------



## Dimadon (20. Jun 2017)

Also mit einer einfachen Tabelle und dem Statement:


```
INSERT INTO test (`text`,`zusatz`) VALUES ("test","test2")
  ON DUPLICATE KEY UPDATE `id`= 1+1;
```

Bekomme ich einen neuen Datensatz wenn die Id noch nicht bekannt ist.


----------



## Dimadon (20. Jun 2017)

Kann ich ON DUPLICATE KEY UPDATE auch mit einem AND erweitern und somit zwei Datensätze abfragen?


----------



## Tobse (20. Jun 2017)

Die ID updated man nicht, niemals.

Versuch mal 
	
	
	
	





```
INSERT INTO test (`text`,`zusatz`) VALUES ("test","test2") ON DUPLICATE KEY UPDATE text = text + ' updated'
```



Dimadon hat gesagt.:


> Kann ich ON DUPLICATE KEY UPDATE auch mit einem AND erweitern und somit zwei Datensätze abfragen?


Hä? Das ist ein schreibender Befehl, wieso willst du was abfragen?


----------



## Thallius (20. Jun 2017)

Kann ja nicht sein da ja keine zwei Datensätze zutreffen können... irgndwiechast du das Prinzip wohl noch nicht verstanden


----------



## Dimadon (20. Jun 2017)

Tobse hat gesagt.:


> *INSERT* *INTO* test (`text`,`zusatz`) *VALUES* ("test","test2") *ON* DUPLICATE *KEY* *UPDATE* text = text + ' updated'


Ausführung korrekt hat mir jetzt in der ersten Spalte den Input "text" gelöscht und durch eine 0 ersetzt.


----------



## Thallius (20. Jun 2017)

Ich würde es mit CONCAT versuchen


----------

