Förutsatt att id
är unik för varje rad kan du göra detta med variabler:
update <table> t join
(select t.id, @rn := @rn + 1 as seqnum
from <table> t cross join (select @rn := 0) vars
order by old_position
) tt
on tt.id = t.id
set t.position = tt.seqnum;
Om du vill kan du skriva detta utan underfrågan. Utmaningen är att definiera variabeln. Här är en metod:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Du kan inte initiera variabeln i en underfråga eftersom MySQL inte tillåter både join
och order by
i en update
uttalande.