php - 使用多行

时间:2016-02-20 22:22:50

标签: php mysql arrays row on-duplicate-key

我知道这个问题已经存在但我无法弄清楚如何在我的情况下解决它。我尝试使用带有sql的UPDATE语句,但在处理多个行时遇到问题。

这是我的代码:

$body = file_get_contents('php://input');
$jsonArray = json_decode($body, true);

$sql = array();
foreach ($jsonArray as $row) {   

    $sql[] = '("'.$row['firstname'].'", "'.$row['lastname'].'", "'.$row['sex'].'", "'.$row['dateOfBirth'].'", "'.$row['email'].'")';

}

$column_name = "(firstname, lastname, sex, dateOfBirth, email)";
$stringImplode = implode(',', $sql);

$action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE XXXXXXX'); // --> I get stuck here

我不知道在ON DUPLICATE KEY UPDATE之后我应该怎么写:我知道它应该像“column_name = value1,column_name2 = value2 ......”但是可以在某种程度上使用上面的数组比如“(column_name1,column_name2 ...)=(value1,value2 ...),如果我要添加多个属性,这可能会有用吗?

由于它位于循环外部,因此我不确定如何在sql []数组中引用我的值,因为我可以为同一列column赋予很多不同的值。

此外,我想在最后添加一个WHERE子句,例如“WHERE timestamp_column_name< timestamp_value”,但我不知道是否可能..

如果有人能帮助我解决这个问题,那就太好了。

1 个答案:

答案 0 :(得分:1)

要回答您的第一个问题,您可以在ON DUPLICATE KEY UPDATE语句中使用VALUES():

$action = $mysqli->query('INSERT INTO tbl_syncList '. $column_name .' VALUES '.$stringImplode .'ON DUPLICATE KEY UPDATE firstname = VALUES(firstname), lastname = VALUES(lastname), sex = VALUES(sex), dateofbirth = VALUES(dateofbirth), email = VALUES(email)');

但是,我不认为使用这种方法可以解决您的第二个问题。我的建议是首先将所有记录插入到临时表中,该表对您要插入/更新的列没有任何唯一约束。然后使用进一步的查询(或者最好是数据库过程)来执行单独的更新,并根据表之间的连接以及您拥有的其他条件插入查询。

我的MySQL有点生疏,但我认为这应该是您将数据插入临时表后所需要的大致内容:

UPDATE a
SET a.firstname = b.firstname,
    a.lastname  = b.lastname,
    a.sex       = b.sex,
    ...
FROM stagingtable b
JOIN tbl_syncList a ON a.idcolumn = b.idcolumn
WHERE b.timestamp > a.timestamp

INSERT tbl_syncList(firstname, lastname, sex, dateOfBirth, email)
SELECT 
    b.firstname,
    b.lastname,
    b.sex,
    b.dateOfBirth,
    b.email
FROM stagingtable b
LEFT JOIN tbl_syncList a ON a.idcolumn = b.idcolumn
WHERE a.idcolumn IS NULL