Wenn die Anzahl der Änderungen eher gering ist, können Sie eine ungeschickte, aber ziemlich effiziente UPDATE-Anweisung generieren, wenn Sie die IDs der beteiligten Elemente kennen:
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;
oder (was mir weniger gefällt):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
UPD :
Angenommen, Sie kennen die aktuelle ID der Kategorie (oder ihren Namen), ihre alte Position und ihre neue Position, können Sie die folgende Abfrage verwenden, um eine Kategorie in der Liste nach unten zu verschieben (um nach oben zu gelangen, müssen Sie den between
Bedingung und new_rank
Berechnung zu 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;