Как динамически установить возрастающее значение на строку в MySQL - PullRequest
0 голосов
/ 17 февраля 2009

Я создаю веб-приложение, которое действует как список приоритетов, позволяя пользователю переупорядочивать набор элементов в списке и сохраняю это расположение в базе данных 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!)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2009

Вы также можете ускорить цикл, если используете подготовленный оператор, который позволяет изменять конкретные значения, пока сервер MySQL хранит запрос в памяти. Для этого необходимо использовать расширение MySQLi вместо обычного MySQL.

Что-то вроде этого:

$mysql = new mysqli(HOST, USER, PASS, DB);

$stmt = $mysql->prepare("UPDATE items SET sortorder = ? WHERE id = ?");

$stmt->bind_params('ii', $sort, $id);

foreach ( $items as $sort => $id ) {
    $stmt->execute();
}
0 голосов
/ 17 февраля 2009

Вы должны построить запрос в PHP, подобный этому, и отправить этот запрос в mysql:

UPDATE `table`
SET priorityLevel = 
CASE 
WHEN `ID` = 12 THEN 1
WHEN `ID` = 17 THEN 2 
WHEN `ID` = 27 THEN 3
WHEN `ID` = 26 THEN 4
WHEN `ID` = 5 THEN 5
END 
WHERE `ID` IN (12, 17, 27, 26, 5);

(протестировано с MySql 5.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...