Si le nombre de modifications est plutôt faible, vous pouvez générer une instruction UPDATE maladroite mais plutôt efficace si vous connaissez les identifiants des éléments concernés :
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;
ou (ce que j'aime moins):
UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
3, 4, 2)
WHERE categoryID in (2,3,4);
UPD :
En supposant que vous connaissiez l'identifiant actuel de la catégorie (ou son nom), son ancienne position et sa nouvelle position, vous pouvez utiliser la requête suivante pour déplacer une catégorie vers le bas de la liste (pour remonter, vous devrez modifier le between
condition et new_rank
calcul au 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;