sql >> Database teknologi >  >> RDS >> Mysql

Omarrangering af kolonnedata i mysql

Hvis antallet af ændringer er ret lille, kan du generere en klodset, men ret effektiv UPDATE-sætning, hvis du kender id'erne for de involverede elementer:

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;

eller (som jeg kan lide mindre):

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

UPD :

Forudsat at du kender det aktuelle id for kategorien (eller dens navn), dens gamle position og dens nye position, kan du bruge følgende forespørgsel til at flytte en kategori ned på listen (for at flytte op skal du ændre mellem condition og new_rank beregning til rang+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;


  1. hvordan man undgår dødvande i mysql

  2. Forsøger at få adgang til array offset på værdien af ​​typen bool

  3. SQLite Bestil efter dato1530019888000

  4. SQL-sætning slettes ikke i PHP