Intereting Posts
Подсчет появления определенного значения в массиве с помощью PHP Интеграция Wordign Codeigniter: как заменить site_url на CI? PHP: использование REGEX для получения имени tablen из запроса mysql Php, я не могу получить доступ к унаследованным частным переменным даже не с отражением SQL Server 2008 возвращает «Предел памяти, превышающий 10240 КБ для буферизованного запроса» Создать новую таблицу из модуля magento Запуск задания Cron на PHP Script, на локальном хосте в Windows Как обновить панели wxAuiManager при обновлении их свойств в wxPHP? Force file загрузить PDF 'open with' box говорит о своем документе в Firefox ?? получение данных из дочернего окна php update обновляет только последнюю запись Запрос MySQL с помощью значений метаданных WordPress Первая строка из результата запроса MySQL не отображается MySQL и PHP – вставьте NULL, а не пустую строку сохранить все текстовые поля, нажав одну кнопку обновления

массовое обновление списка значений из списка идентификаторов

Я часто сталкиваюсь с этой проблемой, как пользователь Oracle, играя с MySql.

Будьте в следующей ситуации:

  • список идентификаторов (1, 2, 3, …, n)
  • список значений ('val1', 'val2', 'val3', …, 'valn') [Значения, очевидно, полностью отличаются от этих]
  • 2 предыдущих списка передаются упорядоченными. Это означает, что переданное значение сначала соответствует первому идентификатору.

Цель состоит в том, чтобы обновить все value таблицы, имеющее соответствующий id : val1 должен обновить id 1, val2 должен обновить id 2 и т. Д. В только ОДНОМ запросе.

Простое решение – обновить n раз:

 UPDATE `value` SET `value`='val1' WHERE id = 1; UPDATE `value` SET `value`='val2' WHERE id = 2; UPDATE `value` SET `value`='val3' WHERE id = 3; ... UPDATE `value` SET `value`='valn' WHERE id = n; 

Но мне бы хотелось, чтобы все это обновлялось.

sqlfiddle немного поиграть: http://sqlfiddle.com/#!2/d02e8

Вот один из способов сделать это, используя один запрос. Это не будет самый красивый формат, но он будет только одним.

 <?php $id_list = implode(',', $ids); $whens = implode( "\n ", array_map( function ($id, $value) { return "WHEN {$id} THEN {$value}"; }, $ids, $values ) ); $sql = " UPDATE value SET value = CASE id {$whens} END WHERE id IN ({$id_list}) "; ?> 

См. Мой измененный SQLFiddle .