Du kan dela upp dem i deras beståndsdelar som:
SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 1),
LENGTH(SUBSTRING_INDEX(prog_id, '.', 1 -1)) + 1),
'.', '') AS id1,
REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 2),
LENGTH(SUBSTRING_INDEX(prog_id, '.', 2 -1)) + 1),
'.', '') AS id2,
REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 3),
LENGTH(SUBSTRING_INDEX(prog_id, '.', 3 -1)) + 1),
'.', '') AS id3
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))
Den bästa metoden skulle vara att skapa de extra fälten som yoda2k säger, men om du inte har den åtkomsten kan du använda ovanstående.
Du kan kapsla in det i en funktion som:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
Gör sedan:
SELECT SPLIT_STR(prog_id, '.', 1) AS id1,
SPLIT_STR(prog_id, '.', 2) AS id2,
SPLIT_STR(prog_id, '.', 3) AS id3,
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))