Если предположить MySQL 8.0, вы можете использовать row_number()
.
. Я бы на самом деле не сохранял эту производную информацию в самой таблице; при изменении данных может потребоваться перенумеровать множество строк.
Вместо этого вы можете вычислить эту информацию на лету, когда это необходимо, или использовать представление:
select c.*, row_number() over(order by state_id, city) sort_order
from cities c
В более ранних версиях вы можно добиться тех же результатов с переменными:
select c.*, (@rn := @rn + 1) sort_order
from cities c
cross join (select @rn := 1 rn) r