ON DUPLICATE KEY UPDATE - 条件WHERE vs CASE WHEN vs IF?

时间:2016-02-22 14:56:41

标签: php mysql if-statement sql-update

我在提及this post。我遇到了一个我无法解决的问题。我尝试用php脚本将多行插入MySQL数据库。我没有成功使用ON DUPLICATE KEY UPDATE和使用WHERE条件更新整个事情(在下面的代码末尾)我想用来更新最近修改过的条目:

// for information (used in a foreach loop):
$args[] = '("'.$row['lastname'].'", '.$row['phone'].', "'.$row['lastModification'].'")';

// then:
$stringImplode = implode(',', $args);

// Where I am stuck - WHERE statement:
$sql = $mysqli->query('INSERT INTO table_name '. (lastname, phone, timestamp) .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE lastname=VALUES(lastname), phone=VALUES(phone) WHERE timestamp > VALUES(lastModification);

一切正常,但我不能在此时设置任何包含多个条目的WHERE条件。在这种情况下,WHERE语句可能不是指本声明中的条件。

我被告知使用JOIN语句和临时表尝试使用数据库过程,首先包含所有条目,然后查询某些条件。但我必须承认,我不太了解如何利用这样的表来更新另一张表。

在这种情况下,使用 "CASE WHEN" "IF" statement 是否有一种简单可爱的方法?

会像

INSERT INTO ... ON KEY DUPLICATE UPDATE lastname = VALUES(lastname), phone = VALUES(phone) 
CASE WHEN (timestamp > VALUES(lastModification)) THEN do nothing ...

...ON KEY DUPLICATE UPDATE... IF (timestamp > VALUES(lastModification)) ...

如果有人能帮助我,我将非常感激。

编辑:由于我会有很多变量,可以这样使用:

INSERT INTO ... ON KEY DUPLICATE UPDATE

IF(timestamp > VALUES(timestamp),
    (
    name = VALUES(name),
    number = VALUES(number),
    timestamp = VALUES(timestamp)
    ....many other variables
    ),
    (
    name = name,
    number = number,
    timestamp = timestamp
    ....many other variables)
    )

1 个答案:

答案 0 :(得分:2)

您可以在值中使用简单的IF函数:

INSERT INTO ... ON KEY DUPLICATE UPDATE
  name = VALUES(name),
  number = VALUES(number),
  timestamp = IF(timestamp > VALUES(timestamp), VALUES(timestamp), timestamp)

如果不满足条件,它将使用已存在的相同时间戳更新时间戳。没关系,因为在执行之前对相同值的更新进行了优化,因此MySQL不会进行真正的更新。你不应该害怕一些性能损失。

修改 IF作品喜欢这样:

IF(condition, returned when true, returned when false)

也许您需要切换这两个参数以满足您的条件。