2016-07-27 96 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 

確定這裏是另一個ridiculus搜索解決方案N,(但它的工作原理)

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字段的表,並把實際的數據在裏面。它完全按照OP要求的方式工作。

+1

當然,不會做任何有用的事情。這將如何應對'產品名稱10'和'產品名稱2'回答「它不會」 – 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