Ако приемем, че id
е уникален за всеки ред, можете да направите това с променливи:
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;
Ако желаете, можете да напишете това без подзаявката. Предизвикателството е дефинирането на променливата. Ето един метод:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Не можете да инициализирате променливата в подзаявка, защото MySQL не позволява и двете join
и order by
в update
изявление.