php - 使用多行更新 sql 语句
php - update sql statement with multiples rows
我知道这个问题已经存在,但我不知道如何解决我的问题。我尝试将 UPDATE 语句与 sql 一起使用,但在处理多行时遇到问题。
这是我的代码:
$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_name 我可能有很多不同的值。
此外,我想在末尾添加一个 WHERE 子句,如 "WHERE timestamp_column_name < timestamp_value" 但我不知道是否可行..
如果有人能帮我解决这个问题那就太好了。
要回答您的第一个问题,您可以在 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)');
但是,我不认为你的第二个问题可以用这种方法来解决。我的建议是首先将所有记录插入到暂存 table 中,该暂存 table 对您所在的列没有任何唯一限制 inserting/updating。然后使用进一步的查询(或者最好是数据库过程)根据 table 之间的连接以及您拥有的任何其他条件执行单独的更新和插入查询。
我的 MySQL 有点生疏,但我认为这应该是您将数据插入暂存区后大致需要的 table :
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
我知道这个问题已经存在,但我不知道如何解决我的问题。我尝试将 UPDATE 语句与 sql 一起使用,但在处理多行时遇到问题。
这是我的代码:
$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_name 我可能有很多不同的值。
此外,我想在末尾添加一个 WHERE 子句,如 "WHERE timestamp_column_name < timestamp_value" 但我不知道是否可行..
如果有人能帮我解决这个问题那就太好了。
要回答您的第一个问题,您可以在 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)');
但是,我不认为你的第二个问题可以用这种方法来解决。我的建议是首先将所有记录插入到暂存 table 中,该暂存 table 对您所在的列没有任何唯一限制 inserting/updating。然后使用进一步的查询(或者最好是数据库过程)根据 table 之间的连接以及您拥有的任何其他条件执行单独的更新和插入查询。
我的 MySQL 有点生疏,但我认为这应该是您将数据插入暂存区后大致需要的 table :
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