2012-03-26 17 views
1

私はテーブルの先頭に "w"をつけて、その後に数字(int)とドットと別の番号(int)をつけてID(tID)を作成しました。MYSQLの高度な並べ替え

サンプルのidの:私はORDER BY tIDを使用する場合

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

返される配列は

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

はい、可能です。しかし、wと2つの列を除いて、2つの整数だけを格納することを検討する必要があります。

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

。 – JNK

1

それは

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

は、これらの機能は、それが何かを使用して、大きな検討していますので、もしテーブル内のすべての行にoperatateする必要がある、と警告することが可能です:ところで

、あなたはこれを使用することができますelse。

+0

これは、以前とは違って、w1.1のinf1.12を置きます。 – JNK

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. 
?>