Мой оператор 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 строк в моем тестовом файле.
Не понимая, почему, я не уверен, что это правильно.
Кажется, вы хотите заказать по длине (обрезанное) поле, чтобы вы могли также сказать:
SELECT styleNo FROM `styles`
WHERE 1
ORDER BY LENGTH(TRIM(`styleNo`)),TRIM(`styleNo`)
потенциально сэкономит вам головную боль, а когда styleNo
будет изменено на один день дольше 6 символов.
ORDER BY LENGTH(keyn) ASC, keyn ASC
? Если я вижу это правильно, вы хотите, чтобы более короткие строки были первыми при всех обстоятельствах, верно?FROM styles ORDER BY 2