Сортировка по строчному значению с учетом численного значения

Prolix

Новичок
Сортировка по строчному значению с учетом численного значения

Здравствуйте,

в таблице имеется набор записей следующего типа:

test-aa-11
test-aa-111
test-aa-11a
test-aa-12
test-aa-13
test-aa-18
test-aa-1800
test-aa-347

показан образец вывода, как это делает mysql (order by... asc). Однако требуется вывод по типу того, как подобные имена файлов отображались бы в Windows Explorer:

test-aa-11
test-aa-11a
test-aa-12
test-aa-13
test-aa-18
test-aa-111
test-aa-347
test-aa-1800

Т.е. в первую очередь берется во внимание строчное значение, и если оно совпадает с предыдущим, сортировка ведется в возрастающем порядке по числовому значению.

Заранее спасибо за совет.
 

Jumbastic

Новичок
Может тебе покажется верным такой вариант:
SELECT *
FROM `sorting`
ORDER BY LENGTH( `name` ) , `name` ASC
LIMIT 0 , 30
 

Prolix

Новичок
Спасибо, но думаю вряд ли это подойдет :)

Не буду говорить о том, что приведены заголовки только для примера и вместо "test-aa" может быть что угодно.

Даже если бы все было в точности, как описано, ваш вариант будет выдавать:

test-aa-11
test-aa-12
test-aa-13
test-aa-18
test-aa-111
test-aa-11a
test-aa-347
test-aa-1800

это совершенно не то...

Вопрос только в том, можно ли это сделать как-то в самом mySQL на основе одной строчки записи. Средствами PHP можно было бы, я знаю. И ввести дополнительные записи в базе тоже можно было бы.
 

Prolix

Новичок
Sergey_Al
Какой именно пример имеется в виду? Если первый пример сверху, то ошибки там нет! Как раз именно в этом и суть вопроса... насколько я понимаю, mysql сортирует следующим образом: сравнивает посимвольно строки, начиная с первого символа, и располагает их в очередности "более весомого" следующего символа. При этом считается, что присутствующий символ имеет бОльший вес над отсутствующим. Вот еще один пример (уже с реального вывода):

AOR AR-22
AOR AR-2500
AOR AR-2700
AOR AR-2700
AOR AR-280
AOR AR-ONE
AOR ARD-9800

По сути, AR-280 должен располагаться над AR-2500.
Обратите внимание, как сортируются записи. Буква "D" больше, чем дефис, поэтому данная запись идет ниже. Равно как и "O" больше, чем 2. Однако символ "0" больше, чем "отсутствующий".

Про binary я не понял - таким образом ведь лишь включается сравнение по строчным-заглавным буквам?..
 

Sergey_Al

Новичок
> Про binary я не понял - таким образом ведь лишь включается сравнение по строчным-заглавным буквам?..

Нет.


Чем не устраивает такой вывод при использовании BINARY:

test-aa-11
test-aa-111
test-aa-11a
test-aa-12
test-aa-13
test-aa-18
test-aa-1800
test-aa-347

?
 

Фанат

oncle terrible
Команда форума
Sergey_Al
чем не устраивает такой вывод, тебе объяснили уже раньше.
поучись сначала читать топик, а только после этого в него отвечать

Prolix
по-моему, единственное решение - добавить две колонкидля сортировки.
А вообще, имхо, проблема того не стоит
 

Sergey_Al

Новичок
Пусть я что-то не понял ... тогда объясните мне почему "test-aa-347" идёт раньше "test-aa-1800" в первом примере ?
 

Sergey_Al

Новичок
Фанат тогда тут просто двумя колонками для сортировки не обойдёшься, т.к. чисел может быть произвольное количество, к примеру:

test-aa-10a-9
test-aa-10a-120

-~{}~ 03.05.07 16:15:

А обязательно средствами MySql ? Может проще извлечь данные, а потом уже отсортировать ?

-~{}~ 03.05.07 16:28:

Если есть ограничение на длину имени файла, тогда сойдёт такой способ: сделать дополнительное поле, в котором числа хранить с незначащами нулями, длина чисел в этом поле должна быть равна максимальной длине файла.
 

Prolix

Новичок
Спасибо всем ответившим.

Выше я упомянул, что Средствами PHP можно было бы, я знаю. И ввести дополнительные записи в базе тоже можно было бы. Но проблема, действительно, того не стоит.

Вопрос был в том, можно ли подобное как-то настроить внутри mysql, потому что список записей на сайте разбивается по страницам. Но я все больше прихожу к выводу, что такое можно устроить лишь каким-то образом оптимизировав само ядро mysql.

Очевидно, что в сортировке файлов Windows сортирует, сравнивая сначала посимвольно, однако как только "натыкается" на численное значение, берет его во внимание целиком, пока следующим символом не встретится снова строчное значение. Однако в mysql такое, видимо, невозможно совсем...
 

kruglov

Новичок
Prolix
Ну, почему невозможно, пишем какой-нибудь order by if(блабла...) - и можно замутить любые извращения, в принципе.
 

Wicked

Новичок
kruglov
и забыть про индексы .-)
хотя про них придется забыть в любом случае, если не послушаться Фаната.
 

Prolix

Новичок
kruglov

Как раз-таки в if и проблема ;-) Я не представляю себе этот if.
 
Сверху