我目前正在使用两个更新查询,我想知道是否有办法将其缩减为一个。
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);
我正在尝试获得更多更新的查询:
UPDATE `Table1`
SET `field1` = `field1` + 1,
`field2` = NOW(),
`field3` = ISNULL(NOW(), `first_seen`);
答案 0 :(得分:70)
我认为您可以使用IF语句来完成此操作。 IF语句在您使用它时需要3个参数:表达式,值为true,值为false
因此,在您的情况下,您可以像以下一样编写查询:
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;
这样,如果表达式为真,那么field3
将为NOW()
,否则,它将保持原样。
答案 1 :(得分:12)
在您的情况下,您可以使用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可选
答案 2 :(得分:0)
如果field3
必须使用与field1
和field2
不同的条件进行更新,我认为您无法在一个查询中执行所有操作。
如果查询必须一起执行或什么都不执行,那么你可以做TRANSACTION。
答案 3 :(得分:0)
您可以这样做:
UPDATE `Table1`
SET `field1` = `field1` + 1,
`field2` = NOW(),
`field3` = COALESCE(field3, NOW())
WHERE id = 1;
这将更新所有field1和field2,并且如果field3为null也将对其进行更新,如果其不为null,则将保持原来的状态。但这仅适用于NULL !!!