2017-01-25 3 views
2

このタイプを1.1,1.1.1,1.2,2.1,2.1.1,2.3、...などにソートしたいと思います。このように私はこの列のVarcharデータ型を使用していますが、何が起こるかは、この10.1.1の後、9.9.9まで適切にソートされています。ここでの並べ替えは1.1,1.1.1,1.2.2のようになります。10.1.1、 2.1,2.1 .1、...など。このように私もDECIMALを使ってみましたが結果はありませんでした。Mysqlで "1.1.1"フォーマットタイプをソートする

+0

dbに挿入するときにunique_idのようなもう1つの列を作成します。これは一意であり、検索時にソートに使用できます。 – Abhishekkumar

+0

ハックとして、INET_ATONとINET_NTOAを使用することができます – Strawberry

+1

http://stackoverflow.com/questions/7508313/mysql-sorting-of-version-numbersを参照してください。関数を使用して結果をソートするすべてのソリューションは使用できませんインデックスなので遅くなる可能性があります。パフォーマンスが優れている場合は、文字列の各部分を索引付けできるように別々の列として格納することを検討してください。 –

答えて

0

データベース内ではなく、3つの異なる列に値を解析することができます。アプリケーションコードでより簡単に行うことができます。そうすれば、簡単になります

select ... order by col1, col2, col3 
+0

おかげさまで.. !! –

0

あなたの番号を固定サイズとして保存することをお勧めします。

  • 1.1.1 => 001001001(またはショート1001001中)
  • 1.1 => 1001000
  • 9.9.9 => 9009009

あなたが数としてあなたの変数を格納することができますこの方法です。取得時には、モジュロを使用して数字を文字列に戻す必要があります。私の例では999は各セグメントの最大値です この方法はIPアドレスを保存する方法です(192.168.1.1は192168001001になります) 。

+0

Thanks Buddy .. !! –

0

これを試してみてください:

SELECT 
    * 
FROM 
    my_table 
ORDER BY 
    CAST(SUBSTRING_INDEX(my_col, '.', 1) AS UNSIGNED) ASC, 
    CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(my_col, '.', -2), '.', 1) AS UNSIGNED) ASC, 
    CAST(SUBSTRING_INDEX(my_col, '.', -1) AS UNSIGNED) ASC 

基本的には、文字列の各部分の部分文字列を取得し、左から右に行く、文字列の各部分を使用して行をソートし

。更新:上記のクエリは、正確に3つの数字に対して機能しますが、このクエリを使用し、その後、4つの数字をサポートするためのアリ:

SELECT 
    * 
FROM 
    my_table 
ORDER BY 
    SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 1), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 2), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 3), '.', -1) + 0 
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', 4), '.', -1) + 0 

そして、あなたはより多くの数をサポートしたい場合は、単に次の番号で「XX」に置き換えて、次の行を追加します。

, SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(my_col, '.'), '.', XX), '.', -1) + 0 

クレジットへこの回答は非常によく似た質問です:https://stackoverflow.com/a/17849200/2518200

+0

こんにちは、この回答をお寄せいただきありがとうございますが、依然として適切な結果が得られません。上記のクエリから取得 結果: 7.3.1.1、7.3.1.2、7.3.1.4、7.3.2.2、7.2.4、12.2.1、12.2 結果欲望 7.2.4、7.3.1.1、7.3.1.2 、7.3.1.4、7.3.2.2、12.2、12.2.1 –

+1

@Jaineshshah申し訳ありませんが、そのクエリは3つの数字でした。あなたは最大4つの数字以上を持っているので、私は自分の答えを変えなければなりませんでした。私の更新された答えを見てください。この新しいクエリは任意の長さに使用できます。 –

関連する問題