En supposant que id
est unique pour chaque ligne, vous pouvez le faire avec des variables :
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;
Si vous le souhaitez, vous pouvez écrire ceci sans la sous-requête. Le défi consiste à définir la variable. Voici une méthode :
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Vous ne pouvez pas initialiser la variable dans une sous-requête car MySQL n'autorise pas les deux join
et order by
dans une update
déclaration.