Я знаю, что эта проблема уже существует, но я не могу понять, как ее решить в моем случае. Я пытаюсь использовать оператор 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 «но я не знаю, возможно ли это ..
Если бы кто-нибудь мог помочь мне решить эту проблему, это было бы здорово.
Чтобы ответить на ваш первый вопрос, вы можете использовать VALUES () в операторе ON DUPLICATE KEY UPDATE:
$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
Других решений пока нет …