2013-05-16 31 views
8

Mam następujące kwerendy używany:Warunkowe ON duplikat KEY UPDATE (Aktualizacja tylko wtedy, gdy pewien warunek jest spełniony)

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES (:username, NOW(), 1, :ip) 
ON DUPLICATE KEY UPDATE 
lastupdate = NOW(), programruncount = programruncount + 1, ip = :ip; 

Jednak również chcę, aby ON DUPLICATE KEY UPDATE warunkowy, więc będzie wykonać następujące czynności:

  • IFlastupdate była mniejsza niż 20 godziny temu (lastupdate > NOW() - INTERVAL 20 MINUTE).
  • True: Zaktualizuj , dodaj jedną do programruncount, a następnie zaktualizuj ip = :ip.
  • Fałsz: Wszystkie pola należy pozostawić takie same.

nie jestem pewien, w jaki sposób mogę to zrobić, ale po patrząc dookoła, próbowałem za pomocą instrukcji IF w ON DUPLICATE KEY UPDATE części.

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES ("testuser", NOW(), "1", "127.0.0.1") 
ON DUPLICATE KEY UPDATE 
IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate, programruncount + 1), 
lastupdate, programruncount); 

Jednak ja otrzymuję następujący błąd: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate, programruncount +' at line 6

Odpowiedz

19

używasz IF nieprawidłowo

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES (:username, NOW(), 1, :ip) 
ON DUPLICATE KEY UPDATE 
lastupdate = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, NOW(), lastupdate), 
programruncount = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, programruncount + 1, programruncount), 
ip = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, :ip, ip); 

więc jeśli sprawdza warunek i powrócić jedną z dwóch wartości dostarczane jako jego parametry . Zobacz MySQL's Flow Control Operators.

Powiązane problemy