Mysql
 sql >> Base de données >  >> RDS >> Mysql

Réorganisation des données de colonne dans mysql

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;