2012-03-26 106 views
1

我有一個完整的id(tID),它是在開始時用「w」創建的,後跟一個數字(int)一個點和另一個數字(int)。MYSQL高級排序

樣品編號的:

w1.3, w1.12, w1.1, w1.1, w2.10, w2.4 

當我使用ORDER BY tID返回的數組

w1.1, w1.12, w1.2, w1.3, w2.10, w2.4. 

我想它是

w1.1, w1.2, w1.3, w1.12, w2.4, w2.10 

這是可能的MySQL查詢中?

回答

1

是的,這是可能的。但是你應該考慮只存儲2個整數,而不是w,並且在2列中。

在此期間,您可以使用此:

ORDER BY 
    CAST(SUBSTRING_INDEX(REPLACE(tID, 'w', ''), '.', 1) AS SIGNED INT) 
    , CAST(SUBSTRING_INDEX(tID, '.', -1) AS SIGNED INT) 
+0

由於有沒有那麼多的項目到目前爲止,我可能會用這個去。 – JNK 2012-03-26 13:50:33

1

有可能

select * 
    from sorting 
order by cast(substring(tID,2) as DECIMAL); 

被警告,這些功能需要在每一行operatate表中的,所以如果它的一大考慮使用的東西其他。

+0

現在,w1.1與之前不同,現在將w1.1的前面。 – JNK 2012-03-26 13:49:09

0

將結果傳遞回來並對調用MySQL的語言進行排序可能更有效。

例如:

<?php 
    $sql = mysql_query("select * from `sorting`"); 
    $arr = []; // Array() before PHP 5.4 
    while($a = mysql_fetch_assoc($sql)) $arr[] = $a; 
    usort($arr,function($a,$b) { // use create_function before PHP 5.3 
     return strnatcasecmp($a['tID'],$b['tID']); 
    }); 
    // $arr is now ordered the way you wanted it in the query 
    // but there is no ordering in MySQL, which may improve performance 
    // depending on the database engine you're using. 
?>