@doutaxe

Как собрать многострочный INSERT циклом?

Здравствуйте! Есть PHP-парсер, который вставляет данные в MySQL. Код выглядит так.
$url_statistic = file_get_contents("https://example.ru");
$json_statistic = json_decode( $url_statistic );
$statistic = $json_statistic->statistic;
foreach ($statistic as $stat) {
$id = $stat->id;
$name = $stat->name;
$descripition = $stat->description;
$balance = $stat->balance;
$query = "INSERT INTO table (id, name, description, balance) VALUES ('$id', '$name', '$description', '$balance') ON DUPLICATE KEY UPDATE balance='$balance'";
mysqli_query($sql, $query);
}

Получаемый объем данных из file_get_contents вырос в 2 раза. Количество единичных INSERT-ов, соответственно, тоже, что значительно нагружает ЦП (каждый поток парсера отжирает 3% ЦП, раньше было около 1%). Прочитал, что можно собирать INSERT-ы в один множественный, что значительно выгоднее по производительности, типа так:
INSERT INTO myTableName
  (idColumnName, columNameOne, columTwo, other_column)
VALUES
  (100, 'Name 1', 'Value 1', 'Other 1'),
  (101, 'Name 2', 'Value 2', 'Other 2'),
  (102, 'Name 3', 'Value 3', 'Other 3'),
  (103, 'Name 4', 'Value 4', 'Other 4');

Но как в цикле собрать все это в один INSERT найти не смог и сам не соображу. Если кто сталкивался с подобным, подскажите как быть?
  • Вопрос задан
  • 1081 просмотр
Решения вопроса 1
fwlone
@fwlone
^^
Примерно так, сначала собрать VALUES потом подставить в запрос
$url_statistic = file_get_contents("https://example.ru");
$json_statistic = json_decode( $url_statistic );
$statistic = $json_statistic->statistic;
$values = '';

foreach ($statistic as $stat) {
    $id = $stat->id;
    $name = $stat->name;
    $descripition = $stat->description;
    $balance = $stat->balance;
    
    $values .= "('$id', '$name', '$description', '$balance'),";
}

$values = trim($values, ',');
mysqli_query($sql, "INSERT INTO table (id, name, description, balance) VALUES $values ON DUPLICATE KEY UPDATE balance = VALUES(balance)");
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы