Запрос mySQL для перемещения элемента в списке
Можете помочь, правильно ли я сделал или же есть другие варианты, для более оптимального перемещения элемента в списке?
Есть список:
| id | name|
1 | f1
2 | f2
3 | f3
4 | f4
5 | f5
6 | f6
7 | f7
8 | f8
9 | f9
Допустим нужно сместить элемент f6 нужно переместить из позиции 6 на позицию 4 смещая элемент f4 и последующие на позицию вниз, т.е. получить такой список:
| id | name
1 | f1
2 | f2
3 | f3
4 | f6
5 | f4
6 | f5
7 | f7
8 | f8
9 | f9
Для этого я использую следующий запрос в mySQL:
LOCK TABLES `categories` WRITE;
DELETE FROM `categories` WHERE `id` = '0';
UPDATE `categories`
SET `id`=
(CASE
WHEN `id` = '6' THEN 0
ELSE `id`+'1'
END)
WHERE `id` > '3' AND `id` < '7' order BY `id` DESC;
UPDATE `categories` SET `id` = '4' WHERE `id` = '0';
UNLOCK TABLES;
Данный запрос блокирует таблицу от записи (LOCK TABLES categories WRITE), если будет строка с индексом равный 0 (вдруг будет по ошибке там такой), то удаляет ее (DELETE FROM categories WHERE id = '0').
Следующие строки кода находит строки с позиции 4 (на которую нужно переместить) до позиции 6 (с которой перетаскивают) и увеличивает id на 1 значение, кроме строки с id = 6, ей назначают индекс 0.
Дальше уже строку с индексом id = 0, меняют на 4 позицию (UPDATE categories SET id = '4' WHERE id = '0').