Перенумеровать элементы в списке сложно.Когда вы нумеруете элементы в списке, используя несколько отдельных операторов SQL, это еще сложнее.
Ваш внутренний оператор sub-select также не ограничен должным образом.Вам нужно дополнительное условие, такое как:
AND id_list = '$id_pl'
Возможно, есть много способов сделать это, но последует самый простой.Я предполагаю, что:
- непоказанный цикл
foreach
генерирует $pos
значений в нужной последовательности (1, 2, ...) - значение
$id_pl
константа для цикла - цикл
foreach
дает значения для $us
и $item
для каждой итерации - комбинация
$id_pl
, $us
и $item
уникально идентифицирует строку в таблице list
- не более 100
pos
значений для беспокойства о - вы можете использовать явную транзакцию вокруг последовательности операторов
Предлагаемое решение состоит из двух этапов:
- Выделите 100 + pos для каждого ряда, чтобы поместить его в новую позицию
- Вычтите 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 на новое для всех строк в одной операции.Вероятно, это более эффективно, особенно если таблица сопоставления может быть сгенерирована как запрос, но это зависит от того, является ли перенумерация алгоритмической.Показанная методика, хотя и несколько неуклюжая, может быть использована для произвольной перенумерации.