3

mysqlの英数字を含む列の場合に数字のみを並べ替えるにはどうすればよいですか?

列(名前)は一意のフィールドです。

私のテーブルにはレコードが含まれています

id  name
1   ab001
2   ab010
3   aa002
4   ac004
5   ba015
6   ba006
7   aa005
8   ac003

結果は次のようになります。

id  name
1   ab001
3   aa002
8   ac003
4   ac004
7   aa005
6   ba006
2   ab010
5   ba015

このクエリSelect * from test order by nameを試していると、結果は英字のみで表示されます。どうすればこれを入手できますか?

4

4 に答える 4

7

私はこのようにします:

select id, name from Table1 order by names + 0, names;

注文なし:

mysql> select * from alpha;
+---+-------+
| i | name  |
+---+-------+
| 1 | ab001 |
| 2 | ab010 |
| 3 | aa002 |
| 4 | cc001 |
| 5 | cb010 |
| 6 | aaa02 |
+---+-------+
6 rows in set (0.00 sec)

私の質問で:

mysql> select i, name from alpha order by name + 0, name;
+---+-------+
| i | name  |
+---+-------+
| 3 | aa002 |
| 6 | aaa02 |
| 1 | ab001 |
| 2 | ab010 |
| 5 | cb010 |
| 4 | cc001 |
+---+-------+
6 rows in set (0.00 sec)
于 2010-06-03T21:36:35.440 に答える
6

文字列が常に3桁で終わると仮定すると、次のように使用できますRIGHT

SELECT id, name
FROM Table1
ORDER BY RIGHT(name, 3);

結果:

1、「ab001」
3、「aa002」
8、「ac003」
4、「ac004」
7、「aa005」
6、「ba006」
2、「ab010」
5、「ba015」

MySQLは機能インデックスをサポートしていないため、このクエリは比較的遅くなります。関数の値を並べ替える必要がないように、データベースを再設計する(たとえば、番号を個別に保存する)ことをお勧めします。

于 2010-06-03T21:25:40.910 に答える
0

少し違う問題がありましたが、2番目の例でうまくいきました。投票しますが、ここから始めたばかりです。

私はあらゆる種類の情報を含むことができる単一のvarchar列を扱っていましたが、その中に何が含まれていても適切にソートする必要がありました。

したがって、私の列には次のような情報を含めることができます。

AB CD EF GH

また

01 02 03 04

Xavierからの回答により、情報がすべてアルファベットの場合はアルファベット順になり、情報が数値の場合は数字になりました。

ありがとう

ありがとう!

于 2010-09-21T16:08:57.900 に答える
0

最初のX文字が文字で、残りが数字でアルファ文字が異なる場合は、構造を変更して、このデータを2つの列(最初の文字用と数字用)に配置することをお勧めします。これで、注文するたびに共変換を行う必要はありません。最初に文字列、次に数字列で注文するだけです。頻繁に注文する場合やデータセットが大きい場合は、構造の再設計が特にこれを行うためのより良い方法です。

現在のフィールドをPKのままにして、トリガーを2つの新しいフィールドに分離することもできます。このように、データは、入力または更新されたときに自動的に順序付けできる形式で配置され、現在のすべてのコードは引き続き機能しますが、よりパフォーマンスの高い順序付けを使用するようにリファクタリングできます。

于 2011-09-22T14:10:23.043 に答える