2016-03-03 3 views
0

Мне нужно выполнить следующий запрос, но будет использовать подготовленный оператор. Обратите внимание, что количество предложений WHERE будет изменяться в зависимости от данных, отправляемых на сервер.UPDATE-запрос с использованием подготовленной инструкции с несколькими условиями WHERE

UPDATE bla SET x=123 
WHERE (y=4 AND z=3) 
OR (y=12 AND z=13) 
OR (y=13 AND z=13) 
OR (y=25 AND z=23) 
OR (y=37 AND z=33) 
OR (y=39 AND z=13) 
OR (y=44 AND z=23) 
OR (y=54 AND z=33) 
OR (y=84 AND z=23) 
OR (y=94 AND z=23) 
OR (y=99 AND z=33); 

Я мог бы произвести одно из следующих массивов:

$arr=[12,13,13,13,25,23,27,33,39,13,44,23,54,33,83,23,94,23,99,33]; 

или

$arr=[[12,13],[13,13],[25,23],[37,33],[39,13],[44,23],[54,33],[84,23],[94,23],[99,33]]; 

было бы лучше сделать это с помощью одного запроса UPDATE, или 10 UPDATE запросов для каждого пара?

Если один запрос, какой был бы лучший способ сделать это?

ответ

1

В MySql вы можете выполнять сравнение кортежей.

Таким образом, вы можете сделать что-то вроде этого

UPDATE bla 
SET x=123 
WHERE (x,y) in ((12,13),(13,13),(25,23),(37,33),(39,13),(44,23),(54,33),(84,23),(94,23),(99,33)) 
2

Сделайте это с помощью одного запроса, который построен с использованием implode и array_map.

$where = implode(' OR ', array_map(function($e) { 
    return "(y = $e[0] AND z = $e[1])"; 
}, $arr); 
$sql = "UPDATE bla SET x = 123 WHERE $where"; 
+0

Спасибо за использование tubles, и PHP, а также. – user1032531

+0

На самом деле, я все еще хочу использовать подготовленный оператор, поэтому я просто буду генерировать '(?,?)' И развязать их с помощью ',', правильно? А затем используйте мой второй пример массива? – user1032531

+0

Да. См. Http://stackoverflow.com/questions/33702794/best-multiinsert-way-to-add-database-in-php/33702893#33702893 для чего-то подобного. Это делает «INSERT», но общая идея такая же. – Barmar

Смежные вопросы