3

mysql の順序付けに問題があります。私のクエリ:

SELECT * FROM versions ORDER BY version DESC

次のようなバージョンの一部がリストされています。

25.0.1364.86
25.0.1364.124
23.0.1271.100

ただし、.124 は .86 よりも高くなっています。

どうすれば修正できますか?

4

5 に答える 5

3

@peterm から投稿されたクエリの小さな改善 (感謝します!)

SELECT *
FROM `versions`
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) asc, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) asc, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) asc, 
     1*SUBSTRING_INDEX(version, '.', -1) asc,
     version asc # this will sort non-numeric strings

バージョンは任意の形式で記述できるため、より複雑な値、文字、数字、ダッシュ、およびポイントでテストしました。

| version |
-----------
| a-b     |
| a-c     |
| ab      |
| b       |
| c       |
| c.a     |
| c.a.b   |
| c.b     |
| c.b.a   |
| c.b.b   |
| ca      |
| 1.2     |
| 1.2.1   |
| 2.1.1   |
| 2.1.2   |
| 3       |
| 10      |
| 123     |
于 2013-07-25T09:13:22.870 に答える
2

列の形式versionが固定されている場合は、バージョンをパーツとそれらに分割できORDER BYます。

SELECT *
FROM versions
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) DESC, 
         1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) DESC, 
         1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) DESC, 
         1*SUBSTRING_INDEX(version, '.', -1) DESC

出力:

|       VERSION |
-----------------
| 25.0.1364.124 |
| 25.0.1364.86  |
| 23.0.1271.100 |

SQLフィドル

于 2013-03-12T23:57:10.953 に答える
1

パーティーには遅れましたが、INET_ATON() 関数を使用すると、これに対するはるかに簡単な答えがあります。

SELECT * FROM versions ORDER BY INET_ATON(version)

出力します

23.0.1271.100
25.0.1364.86
25.0.1364.124

INET_ATON() の詳細については、http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton を参照してください

于 2015-09-24T16:30:18.920 に答える
0

テーブルがどのように定義されているかを知らなければversions、確実に答えることは困難ですが、テキストとして検索されているように見えます。この場合、86は124より大きくなります(辞書の順序を考えてください)。簡単な解決策の1つは、データを2つの形式でテーブルに格納することです。たとえば、文字列として25.0.1364.86、小数として2501364.86など、10進数に相当する文字列を保持します。これにより、注文が期待どおりに機能することが保証されます。

于 2013-03-12T23:40:25.643 に答える
0

これが私のアプローチです(私がそれについてブログを書いたことを気にしないでください):

SELECT v.version 
FROM   (SELECT version, 
               Cast(Substring_index(version, '.', 1) AS UNSIGNED INTEGER)  major, 
               Cast(Substring_index(Substring_index(version, '.' 
                   , 2 ), '.', -1) AS UNSIGNED INTEGER)                    minor, 
               Cast(Substring_index(Substring_index(version, '.' 
                   , -2 ), '.', 1) AS UNSIGNED INTEGER)                    patch, 
               Cast(Substring_index(version, '.', -1) AS UNSIGNED INTEGER) build 
        FROM   versions) v 
ORDER  BY v.major, 
          v.minor, 
          v.patch, 
          v.build

結果

| | バージョン |
-----------------
| | 23.0.1271.100 |
| | 25.0.1364.86 |
| | 25.0.1364.124 |

デモを見る

于 2013-03-13T00:32:27.500 に答える