To zadziała, jeśli wiersz ma do 9 części.
Jeśli istnieje przypadek dla większej liczby części, możesz rozszerzyć podzapytanie, aby zawierało więcej liczb niż 9:
select
group_concat(
replace(t.part, '-', concat(' ', left(t.part, 2)))
order by t.partno
separator ' '
) Models
from (
select t.Models, p.partno,
replace(replace(
substring_index(t.Models, ';', p.partno),
substring_index(t.Models, ';', p.partno - 1),
''
), ';', '') part
from parts_listing t cross join (
select 1 partno union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6 union all
select 7 union all select 8 union all select 9
) p
where replace(replace(Models, '-', ''), ';', '') regexp'^[0-9]*$'
) t
where t.part <> ''
group by t.Models
order by t.Models
Zobacz demo
.