Большинство версий MySQL не поддерживают row_number()
.Таким образом, вы можете сделать это с помощью переменных.Но вы должны быть очень осторожны.MySQL не гарантирует порядок вычисления переменных в select
, поэтому переменной не следует присваивать ссылки в разных выражениях.
Итак:
select t.*,
(@rn := if(@p = parent_id, @rn + 1,
if(@p := parent_id, 1, 1)
)
) as line_no
from (select t.* from t order by id) t cross join
(select @p := 0, @rn := 0) params;
Подзапрос для сортировкитаблица может не быть необходимой.Где-то в версии 5.7 это стало необходимым при использовании переменных.
РЕДАКТИРОВАТЬ:
Обновление с переменными это весело.В этом случае я бы просто использовал подзапросы со следующим:
update t join
(select t.*,
(@rn := if(@p = parent_id, @rn + 1,
if(@p := parent_id, 1, 1)
)
) as new_line_no
from (select t.* from t order by id) t cross join
(select @p := 0, @rn := 0) params
) tt
on t.id = tt.id
set t.line_no = tt.new_line_no;