Изменить нумерацию элементов в списке с помощью SQL-запросов? - PullRequest
0 голосов
/ 20 марта 2011

Запрос:

$consulta = "UPDATE `list` 
                SET `pos` = $pos 
              WHERE `id_item` IN (SELECT id_item 
                                    FROM lists 
                                   WHERE pos = '$item' 
                                ORDER BY pos DESC 
                                   LIMIT 1)
                AND id_usuario = '$us' 
                AND id_list = '$id_pl'";

Дело в том, что этот запрос находится внутри foreach, и он хочет обновить порядок элементов в списке.Раньше у меня это было так:

$consulta = "UPDATE `list` 
                SET `pos` = $pos
              WHERE `$pos` = '$item' 
                AND id_usuario = '$us' 
                AND id_list = '$id_pl'";

Но когда я обновляю pos 2 -> 1, а затем 1 -> 2, результат получается два раза 2 и нет 1 ...

Есть ли решение для этого запроса?

1 Ответ

1 голос
/ 20 марта 2011

Перенумеровать элементы в списке сложно.Когда вы нумеруете элементы в списке, используя несколько отдельных операторов SQL, это еще сложнее.

Ваш внутренний оператор sub-select также не ограничен должным образом.Вам нужно дополнительное условие, такое как:

AND id_list = '$id_pl'

Возможно, есть много способов сделать это, но последует самый простой.Я предполагаю, что:

  • непоказанный цикл foreach генерирует $pos значений в нужной последовательности (1, 2, ...)
  • значение $id_pl константа для цикла
  • цикл foreach дает значения для $us и $item для каждой итерации
  • комбинация $id_pl, $us и $item уникально идентифицирует строку в таблице list
  • не более 100 pos значений для беспокойства о
  • вы можете использовать явную транзакцию вокруг последовательности операторов

Предлагаемое решение состоит из двух этапов:

  1. Выделите 100 + pos для каждого ряда, чтобы поместить его в новую позицию
  2. Вычтите 100 из каждого pos

Этот метод позволяет избежать каких-либо сложных вопросов о том, перечитываются ли строки, для которых было отрегулировано положение, по одному и тому же запросу.

Внутри цикла:

foreach ...
    ...$pos, $item, $us...

    UPDATE list 
       SET pos = $pos + 100
     WHERE id_item = '$item' 
       AND id_usuario = '$us' 
       AND id_list = '$id_pl'
       AND pos < 100
end foreach

UPDATE list
   SET pos = pos - 100
 WHERE id__list = '$id_pl';

ЕслиВы не знаете размер списков, вы можете назначить отрицательные значения pos в цикле и преобразовать тo положительный после цикла или любого из ряда других эквивалентных отображений.Ключ должен обновить таблицу так, чтобы новые числа pos в цикле не пересекались со старыми числами, а затем корректировать новые значения после цикла.

Альтернативные методы создают временную таблицу, которая отображает старые числаto new, а затем выполняет один оператор UPDATE, который изменяет старое значение pos на новое для всех строк в одной операции.Вероятно, это более эффективно, особенно если таблица сопоставления может быть сгенерирована как запрос, но это зависит от того, является ли перенумерация алгоритмической.Показанная методика, хотя и несколько неуклюжая, может быть использована для произвольной перенумерации.

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