Vinzenz Mai: knifflige (My)SQL-abfrage

Beitrag lesen

Hallo,

INSERT INTO table (artikelnr,titel,rabatt) VALUES (112233,'toller Artikel',10)

ON DUPLICATE KEY UPDATE rabatt=10;

  

> > nun möchte ich den rabatt aber nur updaten, wenn garkein bzw. ein niedrigerer rabatt in dem datensatz vorhanden ist. geht das innerhalb eines sql-statements,  
  

> ja. Es gibt verschiedene Wege.  
  

> IF, IFNULL, CASE, GREATEST, COALESCE könnten Dir dabei helfen, siehe [Funktions- und Operatorreferenz](http://dev.mysql.com/doc/refman/5.0/en/func-op-summary-ref.html) - das hängt von den von Dir nicht genannten Randbedingungen ab. Den Handbuchabschnitt zur [INSERT ... ON DUPLICATE KEY UPDATE Syntax](http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) kennst Du sicherlich schon.  
  
wenn ich mir den Inhalt Deines Doppelpostings anschaue, scheinst Du den Abschnitt nicht ganz verstanden zu haben:  
  

> > INSERT  INTO artikel\_details (artikelnr,beschreibung,rabatt) VALUES ('$nr', '$beschreibung','$rabatt')  
> > ON DUPLICATE KEY UPDATE rabatt=VALUES($rabatt)  
  

> > die fehlermeldung lautet:  
> > Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei '(44)' in Zeile 2  
  
das sieht so aus, als werde Dein Statement durch eine Programmiersprache (vermutlich PHP) erzeugt und Dein Code ist kein SQL-Statement, sondern PHP-Code, der ein SQL-Statement erzeugt. Es ist keine gute Idee, PHP-Code zu posten, wenn man ein SQL-Problem hat, siehe [Zitat 1353](http://community.de.selfhtml.org/zitatesammlung/zitat1353).  
  
Ich gehe davon aus, dass die Variable $rabatt in Deinem Beispiel den Wert 44 enthält. Nun möchte VALUES() bei ON DUPLICATE KEY UPDATE einen Spaltennamen haben, wie Dir die Doku verrät, und verweist dann auf den Inhalt dieser Spalte im INSERT-Statement.  
  
Vermutlich möchtest Du also etwas in der Art:  
  
~~~sql
INSERT INTO artikel_details (  
    artikelnr,  
    beschreibung,  
    rabatt  
) VALUES (  
    112233,  
    'toller Artikel',  
    44  
)  
ON DUPLICATE KEY UPDATE   -- bei Schlüsselverletzung aktualisiere den Inhalt  
    rabatt = [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_greatest@title=GREATEST](    -- der Spalte rabatt durch den größeren Wert von  
        rabatt,           -- bisherigem Inhalt dieser Spate und  
        [link:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_values@title=VALUES](rabatt)    -- dem Wert, den Du in die Spalte rabatt einfügen  
                          -- wolltest.  
)  

Falls Du "bisher noch kein Rabatt" vorhanden über den NULL-Wert handhabst, müsstest Du noch COALESCE() sinnvoll anwenden (was ich schöner finde, als mit IFNULL() zu arbeiten). Sinnvoller als der NULL-Wert wäre es, der Spalte den Standardwert 0 zuzuweisen.

Freundliche Grüße

Vinzenz