Почему этот заказ не работает должным образом?

0

Мой оператор select

SELECT styleNo , right( concat( '######', trim( styleNo ) ) , 6 ) AS keyn 
FROM `styles` WHERE 1 ORDER BY keyn

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

Сначала я хочу от 100 до 999, затем от A00 до Z99, затем от 1000 до 9999 и от A000 до Z999 и т.д.

Я получаю эти результаты.

 101    ###101
 180    ###180
 105    ###105
 104    ###104
 102    ###102
 123    ###123
 124    ###124
 432    ###432
1004    ##1004
1001    ##1001
1002    ##1002
1003    ##1003
1006    ##1006
1234    ##1234
1231    ##1231
1255    ##1255
1288    ##1288
2005    ##2005
2006    ##2006
2007    ##2007
2008    ##2008

Почему результаты не в порядке возрастания? keyn - это то, что я ожидаю.

Я использую MySQL 5.1.36-сообщество с наборами символов UTF-8 во всем мире. Ни один из показанного стиля не содержит ничего, кроме символов от 0 до 9.

Дополнительная информация: я изменил инструкцию sql на

SELECT styleNo , right( concat(repeat('#',5), trim( styleNo ) ) , 6 ) AS keyn
FROM `styles` ORDER BY keyn ASC 

и попробуйте с разными значениями для 5. 3 и более, все должны создавать подходящие значения для keyn.

Однако 3, 4 5, 6 и 7 все производят разные порядки результатов - все неправильно. Значение 8 работает для первых 75 строк в моем тестовом файле.

Не понимая, почему, я не уверен, что это правильно.

  • 0
    почему бы не ORDER BY LENGTH(keyn) ASC, keyn ASC ? Если я вижу это правильно, вы хотите, чтобы более короткие строки были первыми при всех обстоятельствах, верно?
  • 0
    Что произойдет, если вы используете FROM styles ORDER BY 2
Показать ещё 13 комментариев
Теги:
select

1 ответ

0
Лучший ответ

Кажется, вы хотите заказать по длине (обрезанное) поле, чтобы вы могли также сказать:

SELECT styleNo FROM `styles`
               WHERE 1
               ORDER BY LENGTH(TRIM(`styleNo`)),TRIM(`styleNo`)

потенциально сэкономит вам головную боль, а когда styleNo будет изменено на один день дольше 6 символов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню