Передать массив в хранимую процедуру (mysql, php)
Имеется таблица с фотографиями:
create table `photo`
(
`id` bigint unsigned not null auto_increment,
`position` smallint unsigned not null default '0',
primary key (`id`)
) engine = InnoDB
И код на php, который создаёт запрос для сортировки:
$when = '';
$photos = [10,9,8,7,6,5,4,3,2,1]; // Задаётся извне
$photos_implode = implode(',', $photos);
foreach ($photos as $k => $v) {
$when .= " when " . (int)$v . " then $k ";
}
$query = "update photo set position = case id $when else position end where id in ($photos_implode)";
Получается запрос вида:
update photo set
position = case id
when 10 then 0
when 9 then 1
when 8 then 2
when 7 then 3
when 6 then 4
when 5 then 5
when 4 then 6
when 3 then 7
when 2 then 8
when 1 then 9
else position end
where id in (10,9,8,7,6,5,4,3,2,1)
Существует ли элегантный метод реализовать такое с помощью хранимой процедуры?
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
UPDATE photo
SET position = FIND_IN_SET(id, @new_order);
PS. Предполагается, что в параметрах передаётся порядок для каждой имеющейся записи. Если какие-то записи отсутствуют в задаваемом списке, их position получит значение 0.