Esa cadea es un string luego se va a ordenar según las reglas de ordenació de un string (es decir igual que se ordena un diccionario, teniendo en cuenta que los números van por delante de las letras).
El ejemplo de datos que has puesto se ordena de dos formas según si eliges ASC o DESC
1100-1107-1
1200-1234-1
1400-1401-1
1400-1401-100
1400-1401-2
200-201-1
200-201-11
200-201-3
200-201-4
200-201-5
300-301-2
300-301-200
300-301-3
300-302-1
300-302-3
300-302-3
300-302-1
300-301-3
300-301-200
300-301-2
200-201-5
200-201-4
200-201-3
200-201-11
200-201-1
1400-1401-2
1400-1401-100
1400-1401-1
1200-1234-1
1100-1107-1
No hay forma de ordenarlos de otra manera, sin tocar la estructura de datos o sin trabjar con subcadenas.
Estructura:
Usar tres campos de tipo numérico y
Subcadenas:
En el maual encontramos el siguiente post, donde ya se nos dice que
no existe una funció tipo split o explode para separar listas delimitadas por separadores pero dan alguna posible solución
Cita: Posted by Bob Collins on March 17 2006 8:56pm
MySQL does not include a function to split a delimited string. Although separated data would normally be split into separate fields within a relation data, spliting such can be useful either during initial data load/validation or where such data is held in a text field.
The following formula can be used to extract the Nth item in a delimited list, in this case the 3rd item "ccccc" in the example comma separated list.
select replace(substring(substring_index('aaa,bbbb,ccccc' , ',', 3), length(substring_index('aaa,bbbb,ccccc', ',', 3 - 1)) + 1), ',', '') ITEM3
The above formula does not need the first item to be handled as a special case and returns empty strings correctly when the item count is less than the position requested.
Cita: Posted by [name withheld] on March 22 2006 8:02pm
This will split an IP address ("a.b.c.d") into 4 respective octets:
SELECT
`ip` ,
SUBSTRING_INDEX( `ip` , '.', 1 ) AS a,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS b,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS c,
SUBSTRING_INDEX( `ip` , '.', -1 ) AS d
FROM log_table
A todo ello tienes que agregar el convertir los tres valores a numericos
CAST(str AS UNSIGNED)
no lo he probado, para estar seguro de con que esta ordenendo haz primero
es mucho mejor crear los tres campos y trabajar con valores numéricos directamente