With a custom function such as alphas found here, you can order it by first the number portion of the value followed by the string portion of the value.
If you define and populate a table as such:
CREATE TABLE test (t VARCHAR(255));
INSERT INTO test VALUES
('10A'),
('2'),
('2A'),
('4'),
('10'),
('1');
Then create a custom function called alphas which extracts the string portion (no numbers):
DELIMITER |
DROP FUNCTION IF EXISTS alphas;
CREATE FUNCTION alphas( str CHAR(32) ) RETURNS CHAR(16)
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret CHAR(32) DEFAULT '';
DECLARE c CHAR(1);
SET len = CHAR_LENGTH( str );
REPEAT
BEGIN
SET c = MID( str, i, 1 );
IF c REGEXP '[[:alpha:]]' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
RETURN ret;
END |
DELIMITER ;
Then you can do a ordered query like this:
SELECT t FROM test ORDER BY CAST(t AS UNSIGNED), alphas(t);
The CAST function converts strings like 10A to an unsigned number of 10.