ОБНОВЛЕНИЕ запроса с использованием подготовленного оператора с несколькими условиями WHERE
Мне нужно выполнить следующий запрос, но я буду использовать подготовленное заявление. Обратите внимание, что количество предложений 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 для каждой пары?
Если бы один запрос, что было бы лучшим способом сделать это?
2 ответа
Решение
В 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))
Сделайте это с помощью одного запроса, который построен с использованием 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";