2016-07-27 1 views
0

Мне нужно заказать данные запроса в алфавитном порядке, но в некоторых элементах цифры и порядок не являются «естественными».MySQL в алфавитном порядке

например:

TABLE 
products_id 
products_name 
product_price 
... 

Значение поля products_name является:

product 1 
product 2 
product 10 
another 4 product 
new prod 2 
new prod 21 
new prod 10 

мне нужно заказать записи, как это:

another 4 product 
new prod 2 
new prod 10 
new prod 21 
product 1 
product 2 
product 10 

Может кто-нибудь может мне помочь? Спасибо.

+1

Как я предполагаю, что те не настоящее имя продукта вы, вероятно, получить много обманчивых комментариев/ответов – RiggsFolly

+1

" Order By products_name ASC "не работает? –

+1

Если есть ведущие номера, которые вы хотите их первыми или последними? У вас есть запрос с 'order', с которым у вас возникли проблемы? Возможно, вы говорите о http://stackoverflow.com/questions/17418215/order-by-alphabet-first-then-follow-by-number .. – chris85

ответ

-2

вы должны использовать ORDER BY на ваше предложение

ORDER BY products_name ASC (or DESC as you want) 
+1

, чтобы процитировать OP из удаленного аналогичного ответа 'Это не сработает, потому что он не будет сортировать числа. «10» придет до «2» в алфавитном порядке, но для числовой последовательности это неправильно » – RiggsFolly

+0

@RiggsFolly, который не был OP, хотя. Другая исчезающая резьба OP .. – chris85

+0

@ chris85 О да, правильно. Успение - это мать всех ... ошибок! – RiggsFolly

-1

примечания: это не совсем то, что вы просите, но это может быть достаточно

Лучшим способом хорошо для достижения естественной сортировки является сортировать по длине, то по значению, как этот

ORDER BY LENGTH(products_name), products_name 

Ok вот еще ridiculus Solutio п, (но это работает)

SELECT * FROM (
SELECT test, 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    test, 0, ''), 1, ''), 2, ''), 3, ''), 4, ''), 5, '') 
    , 6, ''), 7, ''), 8, ''), 9, '') AS derp 
FROM zzz) t1 
ORDER BY derp, LENGTH(test), test 

Примечания для того, чтобы проверить мое решение я на самом деле создал таблицу под названием ZZZ с полем VarChar называется тестом и положить фактические данные в нем. он работает точно так же, как и спросил ОП.

+1

уверен, что не сделают ничего полезного. Как это справится с 'A product name 10' и' A product name 2' Answer "it wont" – RiggsFolly

+0

Он предназначен для решения проблемы, когда цифры добавляются в конец строки, поэтому при создании изображений у вас есть куча значений, которые все начинаются с «продукта» с добавленными числами от 1 до 1000. В этом случае элементы будут отсортированы правильно, а не 1, 10, 100 и 1000, все находятся рядом друг с другом. Как я сказал, это не идеальное решение, но, по крайней мере, он правильно сортирует похожие продукты. –

+0

Подождите, я должен быть идиот, ваш пример ТОЧНО, что решает мое решение. «Имя продукта 2» предшествует «Название продукта 10», потому что оно имеет более короткую длину. –

0

Правильное решение было бы нормализовать свой дизайн, но просто для удовольствия ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table (x VARCHAR(20) NOT NULL); 

INSERT INTO my_table VALUES 
('product 1'), 
('product 2'), 
('product 10'), 
('another 4 product'), 
('new prod 2'), 
('new prod 21'), 
('new prod 10'); 

SELECT *,SUBSTRING_INDEX(x,' ',1) a, SUBSTRING_INDEX(x,' ' ,-1) b FROM my_table ORDER BY a,b+0; 
+-------------------+---------+---------+ 
| x     | a  | b  | 
+-------------------+---------+---------+ 
| another 4 product | another | product | 
| new prod 2  | new  | 2  | 
| new prod 10  | new  | 10  | 
| new prod 21  | new  | 21  | 
| product 1   | product | 1  | 
| product 2   | product | 2  | 
| product 10  | product | 10  | 
+-------------------+---------+---------+ 
+0

В основном, что я [говорил о] (http://stackoverflow.com/questions/38617460/mysql-alphabetically-number-order/38617870?noredirect=1#comment64621899_38617460), но вам нужно отделить весь текст от трейлинг числа не только к первому пространству – RiggsFolly