電子書籍の厳選無料作品が豊富!

MySQLで、テーブルに書籍名リストが入っているとします。

このとき、列「書名」には、以下のような、書名の後に1から11までの連番がついたデータが順不同で入っています。

国語辞書 1
国語辞書 2
国語辞書 3
・・・
国語辞書 11

このテーブルに対して、「ORDER BY 書名 ASC」でSELECTをかけると、
「国語辞書 11」が一番最初に来て、その後1から順番に並びます。

これを自然な並び(11で始まるのではなく、1~11の順で整列)にするには、どうしたらよいでしょうか?

A 回答 (4件)

非数字の部分の文字数が決まっていれば可能です。


SELECT * FROM ~
WHERE
SUBSTRING(書籍名,1,4),
SUBSTRING(書籍名,5)*1

SUBSTRING(書籍名,5)*1 は書籍名の5文字目以降を
数値化する表現です。但し、非数字があると0になって
しまいます。
書籍名の先頭の非数字部分の文字数が不定だと、
考えられる字数の範囲でUNIONクエリにするしか
ないと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
なるほど、そういう方法もあるんですね。

ただ書籍名の非数字部分の文字数が不定なため、難しそうです。

お礼日時:2013/03/11 22:18

データに手を加えずに行うのは難しいと思います。


通番以外の書名の文字数が決まっているのなら、出来ない事は無いですが・・・。例えば、「国語辞書」の様に4文字なら下記の様にすれば並べられます。

ORDER BY SUBSTR(書名, 1, 4), SUBSTR(書名, 5) + 0

#1さんの言われるように0埋めするか、ソート用のカラムを追加するか、その辺りが落としどころかと。
(ソート用のカラムに0埋めした文字列を格納しても良いでしょう)

ALTER TABLE ~~~ ADD COLUMN 順序 INTEGER;
    • good
    • 0
この回答へのお礼

> ソート用のカラムを追加

そうですね、それが一番簡単な方法かと思います。

しかしこういう自然順ソートの需要はけっこうありそうな気がしますが、なんでMySQLにはその機能が実装されていないのでしょうか。

PHPではnatsort関数というのがあるらしいですが・・・。

お礼日時:2013/03/11 18:03

MYSQLはあまり詳しくないですが


インラインビュー?
こんな感じには書けないですか?

select
書名, A
from (select 書名, concat(書名, '0000') A from ???) as T
order by A

この回答への補足

ありがとうございます。
現在出先なので、戻ったら試してみます。

補足日時:2013/03/11 14:51
    • good
    • 0
この回答へのお礼

自分の理解不足のせいか、思ったような結果になりませんでした。

お礼日時:2013/03/29 10:17

元データの数字割り当てを、適した桁数にして、0埋めする。


DB更新。
それから、SELECTでも何でもいいけど、「ORDER BY 書名 ASC」する。


データの書き換えができないなら、スルーしてください。
(0埋めくらい、許してもらえそうですが。使うときに0消せばいいだけだし。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
ただ出来れば現在のデータそのものをいじらずにやりたいと考えています。

お礼日時:2013/03/11 14:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す