paul: knifflige (My)SQL-abfrage

hallo,
ich möchte folgendes erreichen: ich habe in einer tabelle 'artikel'

die felder

'artikelnr', 'titel' und 'rabatt'.

nun möchte ich folgende abfrage starten:

INSERT INTO table (artikelnr,titel,rabatt) VALUES (112233,'toller Artikel',10)  
  ON DUPLICATE KEY UPDATE rabatt=10;

so weit so gut.
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, oder muss ich da die scriptsprache (php) bemühen??

lg

p

  1. Hallo,

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

    ON DUPLICATE KEY UPDATE rabatt=10;

      
    
    > so weit so gut.  
    > 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.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. 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