2013-04-22 2 views
1

У меня есть база данных MySQL с разными именами изображений, которые я хочу заказать по названию. Проблема в том, что я не знаю, нужно ли мне это делать с PHP или MySQL может быть полезен :)Задание базы данных MySQL (0)

Так MySQL заказывает его, но это, конечно, неправильно - потому что -10.jpg и -11.jpg должно быть внизу.

106-44XKJ7-1.jpg
106-44XKJ7-10.jpg
106-44XKJ7-11.jpg
106-44XKJ7-2.jpg
106-44XKJ7-3.jpg
106-44XKJ7-4.jpg
106-44XKJ7-5.jpg
106-44XKJ7-6.jpg
106-44XKJ7-7.jpg
106-44XKJ7-8.jpg
106-44XKJ7- 9.jpg

Несколько ниже в таблице, в этом случае;

790_49BSBV_2.jpg
790_49BSBV_3.jpg
790_49BSBV_4.jpg
790_49BSBV.jpg

Это выглядит хорошо, но, как вы уже могли догадаться, один без последующей (число после подчеркивания) должно быть первым, _2 должно быть вторым и так далее ...

Заранее благодарим за ваш ответ! :)

+0

Вот почему люди используют 01.jpg, 02.jpg и т. Д. – banging

+0

Посмотрите, можете ли вы заказать любой другой столбец, например, столбец идентификатора или дату. – banging

ответ

2

Это распространенное недоразумение с полями символов. Поскольку 10 и 11 фактически считаются символами/текстом в вашем поле (а не цифрами), они действительно упорядочены правильно, поскольку 10 «больше», чем 1 и «меньше». 2.

Если вы хотите заказать их number, вы можете попробовать что-то вроде разбора цифр от имени, отбросив их как целые числа, а затем упорядочивая их.

Нечто подобное в MySQL может работать:

ORDER BY SUBSTRING(name, 1, LOCATE('-', name, 5)), CAST(REPLACE(SUBSTRING(name, LOCATE('-', name, 5) + 1), '.jpg', '') as SIGNED) 

Это разбирает символы с самого начала и сортирует их. Затем он выполняет второстепенную сортировку, располагая вторую тире в имени и удаляя все перед ней. Затем он удаляет .jpg из этого результата. Он, наконец, отличает его как целое, что позволяет корректно сортировать его.

В качестве альтернативы вы можете просто добавить другое поле в свою таблицу (например, поле DateCreated), а затем сортировка будет более прямой.

ОБНОВЛЕНО ОТВЕТ

ORDER BY 
    SUBSTRING(REPLACE(name, '_', '-'), 1, 5), 
    CAST(REPLACE(SUBSTRING(REPLACE(name, '_', '-'), LOCATE('-', REPLACE(name, '_', '-'), 5) + 1), '.jpg', '') as SIGNED) 

Но опять же, это даст вам некоторые, возможно, неправильно сортировки. См. Мои комментарии ниже.

+0

Для MySQL - 5.1 по крайней мере вызов 'LOCATE' должен быть 'LOCATE ('-', name, 5)' ie ('string-to-be-search',' long-string', 'position-to-start-search') – RedBaron

+0

@RedBaron Спасибо, что поймали это - Я обновил свой ответ. – McCee

+0

Да, это отлично работает для первой части. Но OP также имеет некоторые имена с '_' в своем втором наборе примеров. – RedBaron

Смежные вопросы