2012-03-13 48 views
25

Şu anda iki güncelleştirme sorgusu kullanıyorum ve bunu bir kısma indirmenin bir yolu olup olmadığını merak ediyorum.MySQL IFNULL veya başka bir değer için güncelleştirme alanı Güncelleştirme

field1 OFTYPE INT 
field2 OFTYPE DATETIME 
field3 OFTYPE DATETIME 

UPDATE `Table1` SET `field1` = `field1` + 1, `field2` = NOW() WHERE `id` = $id; 
UPDATE `Table1` SET `field3` = NOW() WHERE `id` = $id AND (`field3` < '2011-00-00 00:00:00' OR `field3` IS NULL); 

Ben daha çok böyle UPDATE yapacağını bir sorgu almaya çalışıyorum: field3field1 ve field2 farklı bir durumla güncellenmesi varsa

UPDATE `Table1` 
SET `field1` = `field1` + 1, 
    `field2` = NOW(), 
    `field3` = ISNULL(NOW(), `first_seen`); 
+0

Bir güncelleştirme eki veya silme ifadesi yalnızca bir tabloyu/görünümü güncelleyebilir. Güzel deneme olsa! – Har

+0

@HarHaHu, OP yalnızca bir tabloyu günceller, bu yüzden bu mükemmel bir şeydir. –

+0

@HarHaHu, okuduğum tek bir tablodur;) –

cevap

59

Size öyle bir IF deyimini kullanarak bunu yapmak için mümkün olduğunu düşünüyorum.

UPDATE Table1 
SET 
    field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = IF(field3 < '2011-00-00 00:00:00' OR field3 IS NULL, NOW(), field3) 
WHERE id = $id; 
: Bir aşağıdaki gibi devam true, değer senin durumunda Yani yanlış

eğer, muhtemelen sorguları yazabilirsiniz eğer ifadeyi, değer: EĞER deyimi kullandıysanız bunu 3 parametre alır

Bu şekilde, ifade doğruysa, field3NOW() olacaktır ve aksi halde olduğu gibi kalacaktır.

+0

Tarih, mysql hatasına neden olur, '2011-01-01 00:00:00' olarak değiştirilir. – Madarco

0

, sana varsayalım hepsini bir sorguda yapamaz. Yapabilecekleriniz, sorguların birlikte veya hiç yürütülmesi gerekmesi durumunda TRANSACTION'dur. Senin durumunda

10

şunu kullanabilirsiniz CASE *:

UPDATE Table1 
SET field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = 
     CASE 
     WHEN field3 < '2011-00-00 00:00:00' THEN /* Evaluates to false if NULL */ 
      NOW() 
     WHEN field3 IS NULL THEN 
      NOW() 
     ELSE /* Don't change */ 
      field3 
     END 
WHERE id = 1 

* Pun opsiyonel

İlgili konular