2016-05-04 237 views
0

我想通過mysql對字母數字數據進行排序。我的數據是一些典型的類型,如:通過MySql對字母數字數據進行排序

XYZ-1.0-7.0-1 
XYZ-1.0-27.0-5.7 
XYZ-1.0-20.0-4.6 
XYZ-1.0-10.0-2.4 
----------------- many more data in this format ------------ 

我GOOGLE了,發現很多鏈接,但都沒有工作。

我想這個數據作爲輸出:

XYZ-1.0-7.0-1 
XYZ-1.0-10.0-2.4 
XYZ-1.0-20.0-4.6 
XYZ-1.0-27.0-5.7 
+0

什麼是第一位的* 1.11 *或* 1.2 *? –

+0

訂單將1.0然後1.1等等。它在所有情況下在「 - 」符號後使用。 – steven

回答

0

從刪除.-值和排序。

查詢

SELECT * FROM your_table_name 
ORDER BY CAST((
    REPLACE(REPLACE(
     RIGHT(your_column_name, LENGTH(your_column_name) - 4), '.', ''), '-', '')) 
AS UNSIGNED); 

SQL Fiddle Demo

+0

如果一個值爲:('XYZ-1.1-7.0-1') – steven

+0

@steven:我已經添加了值「XYZ-1.1-7.0-1」,它的工作正常。請檢查這個小提琴。 http://sqlfiddle.com/#!9/8aec82/1 – Wanderer

+0

如果我們添加「XYZ-1.1-7.0-1」,那麼它應該在底部。 – steven

0

你想要什麼全自動沒有你的幫助的計算機無法做到的。要排序這個值,你需要「教」查詢,這是你的字符串的格式。如果格式始終與「XXX-9.9-9.9-9.9」相同,則需要創建一個查詢,將您的字符串分割爲值,然後進行排序。 喜歡的東西:

SELECT * FROM your_table_name ORDER BY SUBSTRING(col,3), substring(col,5,2), substring(col,5,2), substring(col,9,2) 

的另一個問題是,你的數值並不總是相同的字符串格式:比如你在第三部分「7.0」和「27.0」。如果格式化爲「07.0」和「27.0」的thoose值可用。要使用thoose值,您需要將它們轉換爲數字。 希望這有助於。

0

這個查詢將您的字符串分成幾部分:

select t.col 
    , cast(num1 as unsigned) n1 
    , cast(num2 as unsigned) n2 
    , cast(num3 as unsigned) n3 
    , cast(num4 as unsigned) n4 
    , cast(num5 as unsigned) n5 
    , cast(num6 as unsigned) n6 
from (
    select t.col 
     , SUBSTRING_INDEX(t.col, '-', 1) str 
     , SUBSTRING_INDEX(t.col, '-', -3) num1 
     , SUBSTRING_INDEX(t.col, '.', -3) num2 
     , SUBSTRING_INDEX(t.col, '-', -2) num3 
     , SUBSTRING_INDEX(t.col, '.', -2) num4 
     , SUBSTRING_INDEX(t.col, '-', -1) num5 
     , SUBSTRING_INDEX(t.col, '.', -1) num6 
    from Table1 t 
) t; 
-- 

|    col | n1 | n2 | n3 | n4 | n5 | n6 | 
|------------------|----|----|----|----|----|----| 
| XYZ-1.0-7.0-1 | 1 | 0 | 7 | 0 | 1 | 0 | 
| XYZ-1.0-27.0-5.7 | 1 | 0 | 27 | 0 | 5 | 7 | 
| XYZ-1.0-20.0-4.6 | 1 | 0 | 20 | 0 | 4 | 6 | 
| XYZ-1.0-10.0-2.4 | 1 | 0 | 10 | 0 | 2 | 4 | 

http://sqlfiddle.com/#!9/d3770/1

使用這些零件FO的排序結果:

select t.col 
from (
    select t.col 
     , SUBSTRING_INDEX(t.col, '-', 1) str 
     , SUBSTRING_INDEX(t.col, '-', -3) num1 
     , SUBSTRING_INDEX(t.col, '.', -3) num2 
     , SUBSTRING_INDEX(t.col, '-', -2) num3 
     , SUBSTRING_INDEX(t.col, '.', -2) num4 
     , SUBSTRING_INDEX(t.col, '-', -1) num5 
     , SUBSTRING_INDEX(t.col, '.', -1) num6 
    from Table1 t 
) t 
order by str 
    , cast(num1 as unsigned) 
    , cast(num2 as unsigned) 
    , cast(num3 as unsigned) 
    , cast(num4 as unsigned) 
    , cast(num5 as unsigned) 
    , cast(num6 as unsigned) 

http://sqlfiddle.com/#!9/d3770/2

你Ç一個也消除子查詢:

select t.col 
from Table1 t 
order by SUBSTRING_INDEX(t.col, '-', 1) 
    , cast(SUBSTRING_INDEX(t.col, '-', -3) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -3) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '-', -2) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -2) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '-', -1) as unsigned) 
    , cast(SUBSTRING_INDEX(t.col, '.', -1) as unsigned) 

http://sqlfiddle.com/#!9/d3770/5

+0

如果我們添加「XYZ-1.1-7.0-1」,那麼它應該在底部。 – steven

+0

@steven - 好的,我意識到這種模式並不像我想象的那麼清晰。 「XYZ-1.1-7.0-1」缺少最後一個號碼。無論最後一點('.'),我的解決方案將無法正常工作,因爲我從右向左計數點數。那麼,你的模式是什麼? –

+0

由於這個問題,這是我的模式。由「。和 - 」組成。但是以任何數字格式。 – steven

相關問題