sql >> Base de Datos >  >> RDS >> Mysql

Reordenación de datos de columna en mysql

Si la cantidad de cambios es bastante pequeña, puede generar una declaración de ACTUALIZACIÓN torpe pero bastante eficiente si conoce las identificaciones de los elementos involucrados:

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;

o (que me gusta menos):

UPDATE categories
SET `order` = ELT (FIND_IN_SET (categoryID, '2,3,4'),
                   3, 4, 2)
WHERE categoryID in (2,3,4);

UPD :

Suponiendo que conoce la identificación actual de la categoría (o su nombre), su posición anterior y su nueva posición, puede usar la siguiente consulta para mover una categoría hacia abajo en la lista (para subir tendrá que cambiar el between condición y new_rank cálculo a 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;