###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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ソートしたいデータは全て
[0文字以上のアルファベット] + [1文字以上の数字]
という形式で、0ab1
やab23cd
などのようなデータは存在しない、という前提であれば、
以下の 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
総合スコア4791
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総合スコア4152
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
総合スコア116835
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/18 06:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/18 12:51