2013-02-07 21 views
0

爲什麼當我使用order by seriq asc並且有一個類似 「10000」, 「100000」 號 「97000」爲了通過seriq ASC顯示錯誤的結果

劇本給我的結果:

1: 10000 
2: 100000 
3: 97000 

+0

'seriq'是什麼類型? –

+1

賭它不是int – 2013-02-07 23:35:08

+0

結果是一個字母排序。 – Oerd

回答

3

,因爲它們存儲在您的專欄爲字符串

1-嘗試列seriqVARCHAR/CHAR改變INT

2-您可以使用CAST()將字符串轉換爲int。例如SELECT CAST('123' AS SIGNED);

+1

什麼是2?我討厭1個物品清單。 – Kermit

+0

它來了2,但最好的解決辦法是使列爲int –

+0

它的mysql,它應該是'CAST('123'AS SIGNED)'或* UNSIGNED *。 –

0

您的seriq列必須是用於數值排序的數值列。如果它是一個文本列,值將按照它們的collation按字母順序排序。例如:

CREATE TABLE Test 
(
    Foo int 
); 

INSERT INTO Test VALUES (10000); 
INSERT INTO Test VALUES (100000); 
INSERT INTO Test VALUES (97000); 

select * from Test order by Foo asc; 

Fiddle

+0

我誠實地認爲將它放在臨時表中會更容易。 – Kermit

0

快速的解決辦法是對MySQL進行字符串轉換爲數值的ORDER BY子句。

查詢更改爲:

ORDER BY seriq+0 ASC 

注意,MySQL將嘗試任何字符串轉換爲數值,讀取字符到第一個「無效」字符,例如'123A'將被轉換爲數值123.

+0

這當然不會考慮'seriq'上的任何索引。 –

0

將列類型更改爲int是最佳解決方案,因爲它可以爲您提供最佳的數據存儲和性能。但是,如果這是不是一種選擇,以下解決方法是可能的:

select * from foo order by seqid+0 

此柱強制命令的類型轉換爲int和排序情況數值。