mysql の順序付けに問題があります。私のクエリ:
SELECT * FROM versions ORDER BY version DESC
次のようなバージョンの一部がリストされています。
25.0.1364.86
25.0.1364.124
23.0.1271.100
ただし、.124 は .86 よりも高くなっています。
どうすれば修正できますか?
mysql の順序付けに問題があります。私のクエリ:
SELECT * FROM versions ORDER BY version DESC
次のようなバージョンの一部がリストされています。
25.0.1364.86
25.0.1364.124
23.0.1271.100
ただし、.124 は .86 よりも高くなっています。
どうすれば修正できますか?
@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 |
列の形式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 |
パーティーには遅れましたが、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 を参照してください。
テーブルがどのように定義されているかを知らなければversions
、確実に答えることは困難ですが、テキストとして検索されているように見えます。この場合、86は124より大きくなります(辞書の順序を考えてください)。簡単な解決策の1つは、データを2つの形式でテーブルに格納することです。たとえば、文字列として25.0.1364.86、小数として2501364.86など、10進数に相当する文字列を保持します。これにより、注文が期待どおりに機能することが保証されます。
これが私のアプローチです(私がそれについてブログを書いたことを気にしないでください):
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 |