Я создаю веб-приложение, которое действует как список приоритетов, позволяя пользователю переупорядочивать набор элементов в списке и сохраняю это расположение в базе данных MySQL через бэкэнд PHP.
В тот момент, когда пользователь закончил упорядочивать свои элементы и сохраняет конфигурацию, я вызываю отдельный оператор UPDATE для каждой строки, подключая priorityLevel (позицию в списке) для каждой.
Например: (не мой производственный код, но это иллюстрирует смысл)
<?php
$items = array(12, 17, 27, 26, 5); // an array of IDs, in proper order
// due to nature of foreach loop in PHP, this makes $order be the key value,
// in this case, 0, 1, 2, 3, 4 respectively
foreach ($items as $order => $item)
{
$database->query("UPDATE `table` SET `priorityLevel` = {$order} " .
"WHERE `ID` = {$item}");
}
?>
Это работает достаточно хорошо, но кажется неэффективным запускать так много запросов UPDATE, особенно когда список становится длинным, и мы переупорядочиваем многие элементы. Я надеялся, что есть какой-то способ динамически создать порядок в команде UPDATE, что-то вроде этого:
<?php
$database->query("UPDATE `table` SET `priorityLevel` = ORDER_NUMBER " .
"WHERE `ID` IN (12, 17, 27, 26, 5)");
?>
... где ORDER_NUMBER - это динамическое число, определяемое, возможно, положением значения идентификатора в предложении WHERE. Также необходимо соблюдать порядок элементов в предложении WHERE, чтобы убедиться, что priorityLevel был установлен в соответствии с пожеланиями пользователя.
Кто-нибудь знает, возможно ли это в среде MySQL 5 / PHP 5? В таблице используется механизм MyISAM, поэтому он не поддерживает транзакции.
(PS - я достаточно хорошо знаю некоторые основы MySQL, но я далеко не эксперт, поэтому, если здесь есть что-то, кроме простых команд CREATE, INSERT, UPDATE, DELETE, пожалуйста, будьте наглядными)
(PPS - эта тема сложна для Google, поскольку термины слишком общие. Если я ищу «заказ mysql», я получаю кучу учебных пособий по созданию приложений корзины для MySQL!)