Hvis antallet af ændringer er ret lille, kan du generere en klodset, men ret effektiv UPDATE-sætning, hvis du kender id'erne for de involverede elementer:
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;
eller (som jeg kan lide mindre):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
UPD :
Forudsat at du kender det aktuelle id for kategorien (eller dens navn), dens gamle position og dens nye position, kan du bruge følgende forespørgsel til at flytte en kategori ned på listen (for at flytte op skal du ændre new_rank
beregning til rang+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;