質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

9623閲覧

MySQLでアルファベット、数字の組み合わせを自然順でソートして表示したい

doubutsu.karada

総合スコア26

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2017/07/18 06:20

編集2017/07/18 07:09

###MySQLでアルファベット、数字の組み合わせを自然順でソートして表示したい

※情報が足りなかったため追記致します
MySQL初心者です。例えば以下のような

1 A1 B1 2 A3 A5 AA1 B4 A10

レコードが存在したとして、こちらを

1 2 A1 A3 A5 A10 AA1 B1 B4

といったようなソートで表示することは可能でしょうか?
現状では、

1 2 A1 A10 A3 A5 AA1 B1 B4

というソートになってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ソートしたいデータは全て

[0文字以上のアルファベット] + [1文字以上の数字]

という形式で、0ab1ab23cdなどのようなデータは存在しない、という前提であれば、
以下の SQL文で意図通りに並ぶはずです。

sql

1SELECT * FROM test 2ORDER BY 3 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(value, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '') ASC, 4 LENGTH(value) ASC, 5 value ASC;

実行結果

sql

1mysql> CREATE TABLE test ( 2 -> id INT PRIMARY KEY AUTO_INCREMENT, 3 -> value VARCHAR(8) 4 -> ); 5Query OK, 0 rows affected (0.01 sec) 6 7mysql> INSERT INTO test (value) VALUES 8 -> ('1'), 9 -> ('A1'), 10 -> ('B1'), 11 -> ('2'), 12 -> ('A3'), 13 -> ('A5'), 14 -> ('AA1'), 15 -> ('B4'), 16 -> ('A10'), 17 -> ('A2'); 18Query OK, 10 rows affected (0.01 sec) 19Records: 10 Duplicates: 0 Warnings: 0 20 21mysql> SELECT * FROM test 22 -> ORDER BY 23 -> REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(value, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', '') ASC, 24 -> LENGTH(value) ASC, 25 -> value ASC; 26+----+-------+ 27| id | value | 28+----+-------+ 29| 1 | 1 | 30| 4 | 2 | 31| 2 | A1 | 32| 10 | A2 | 33| 5 | A3 | 34| 6 | A5 | 35| 9 | A10 | 36| 7 | AA1 | 37| 3 | B1 | 38| 8 | B4 | 39+----+-------+ 4010 rows in set (0.00 sec)

もっとも、初めからアルファベット部分と数字部分を別のカラムに格納しておけば
このように難しいことを考えずに済みます。

可能であれば、今からテーブル設計を変更することをお勧めします。

投稿2017/07/18 11:29

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doubutsu.karada

2017/07/18 12:51

ありがとうございました。今のところは[0文字以上のアルファベット] + [1文字以上の数字]のレコードしか存在しませんが、アドバイス頂いた通りテーブル設計の変更を検討してみます。
guest

0

今は環境が無いので試せてませんが、こんな感じでどうでしょう?
ORDER BY 句だけです。
ORDER BY TRANSLATE(val, '0123456789', '') , LPAD(TRANSLATE(val, TRANSLATE(val, '0123456789', ''), ''), 10, '0')
アルファベット+数字の場合のみで数字は10桁までの対応です。

投稿2017/07/18 10:04

編集2017/07/18 10:06
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2017/07/20 09:32

おらおらとまちがえただ
guest

0

普通にそうソートされると思いますが・・・

SQL

1create table tbl(id int unique,val varchar(10)); 2insert into tbl values 3(1,'1'), 4(2,'A1'), 5(3,'B1'), 6(4,'2'), 7(5,'A3'), 8(6,'A5'), 9(7,'AA1'), 10(8,'B4'); 11select * from tbl order by val asc; 12

投稿2017/07/18 06:26

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doubutsu.karada

2017/07/18 06:40

すみません大切なところを書き忘れていました。 (9,'A10')のようなアルファベット+数字二桁以上が入った場合に、 +------+------+ | id | val | +------+------+ | 1 | 1 | | 4 | 2 | | 2 | A1 | | 9 | A10 | | 5 | A3 | | 6 | A5 | | 7 | AA1 | | 3 | B1 | | 8 | B4 | +------+------+ のような表示結果になります。こちらを A1 A3 A5 A10 といったソートで表示することは可能なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問