2011-12-31 2 views
0

У меня есть ряд VARCHAR полей в базе данных MySQL, которые «пронумерованный»:MySQL order_by парциальное Integer в String,

+-----------+ 
| name  | 
+-----------+ 
| thing 1 | 
| thing 2 | 
| thing 3 | 
| ...  | 
| thing 10 | 
| thing 11 | 
+-----------+ 

Я хочу заказать их, как указано выше. Тем не менее, простой ORDER_BY table.name производит что-то вроде следующего:

thing 1 
thing 10 
thing 11 
thing 2 
thing 3 
... 

Это имеет некоторый смысл, так как MySQL обрабатывает все поле как String (VARCHAR). Тем не менее, я пробовал множество методов сортировки, включая CAST(name AS DECIMAL) и name + 0. Это будет только сортировать по десятичной части, игнорируя часть строки. Ни одна из них не работает, потому что мне нужно сортировать по nameсначала и затем сортировать по конечной десятичной системе.

Я пробовал ORDER_BY name, name + 0, но ничего не работает. Как мне выполнить и ORDER_BY, а затем ORDER_BY внутри этого подмножества? (Я думаю, что это сработает).

+0

положить 0 напротив 1, так что это данные 01, 02, 03 в данных. если это не вариант, разрывайте левое и правое на отдельные поля, если это не опция, подстройте левую и правую части в порядке, а затем сначала закажите левой частью, затем правую часть (отринув ее на int) – xQbert

ответ

4

Вы должны иметь два сорта - первый по name части, а второй по цифровой части, как это:

order by left(name,instr(name,' ')),cast(right(name,instr(name,' ')+1) as decimal) 
0

Функция SUBSTRING_INDEX может разделить строку.

SELECT SUBSTRING_INDEX(name, ' ', 1) AS a, CAST(SUBSTRING(name, ' ', -1) AS DECIMAL) AS b 
FROM t 
ORDER BY a, b