このクエリは見栄えがよくないかもしれませんが、必要な順序で行を並べ替えます。
select
MR,
LName,
FName
from (
select
MR,
LName,
FName,
least(
case when locate('0', MR)>0 then locate('0', MR) else length(MR)+1 end,
case when locate('1', MR)>0 then locate('1', MR) else length(MR)+1 end,
case when locate('2', MR)>0 then locate('2', MR) else length(MR)+1 end,
case when locate('3', MR)>0 then locate('3', MR) else length(MR)+1 end,
case when locate('4', MR)>0 then locate('4', MR) else length(MR)+1 end,
case when locate('5', MR)>0 then locate('5', MR) else length(MR)+1 end,
case when locate('6', MR)>0 then locate('6', MR) else length(MR)+1 end,
case when locate('7', MR)>0 then locate('7', MR) else length(MR)+1 end,
case when locate('8', MR)>0 then locate('8', MR) else length(MR)+1 end,
case when locate('9', MR)>0 then locate('9', MR) else length(MR)+1 end) pos
from users
) users_pos
order by
left(MR, pos-1),
mid(MR, pos, length(MR)-pos+1)+0
サブクエリusers_posで、数字の最初の位置を計算しています。次にleft(MR, pos-1)
、文字列の非数値の始まりと文字列mid(MR, pos, length(MR)-pos+1)+0
の数値部分を並べ替えています。0を追加すると数値に変換されます番号として並べられます (したがって、20002 は 200011 の前になります)。
ここで動作することを確認してください。