Ако броят на промените е доста малък, можете да генерирате тромав, но доста ефективен оператор UPDATE, ако знаете идентификаторите на включените елементи:
UPDATE categories
JOIN (
SELECT 2 as categoryID, 3 as new_order
UNION ALL
SELECT 3 as categoryID, 4 as new_order
UNION ALL
SELECT 4 as categoryID, 2 as new_order) orders
USING (categoryId)
SET `order` = new_order;
или (което ми харесва по-малко):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
UPD :
Ако приемем, че знаете текущия идентификатор на категорията (или нейното име), старата й позиция и новата й позиция, можете да използвате следната заявка за преместване на категория надолу в списъка (за преместване нагоре ще трябва да промените between
условие и new_rank
изчисление до rank+1
):
SET @id:=2, @cur_rank:=2, @new_rank:=4;
UPDATE t1
JOIN (
SELECT categoryID, (rank - 1) as new_rank
FROM t1
WHERE rank between @cur_rank + 1 AND @new_rank
UNION ALL
SELECT @id as categoryID, @new_rank as new_rank
) as r
USING (categoryID)
SET rank = new_rank;