Giả sử rằng id
là duy nhất cho mỗi hàng, bạn có thể thực hiện việc này với các biến:
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;
Nếu bạn muốn, bạn có thể viết điều này mà không cần truy vấn con. Thách thức là xác định biến. Đây là một phương pháp:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
Bạn không thể khởi tạo biến trong một truy vấn con vì MySQL không cho phép cả hai join
và order by
trong một bản cập nhật update
tuyên bố.