Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Neuordnung von Spaltendaten in mysql

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;