MySQL のSELECT a ORDER BY XXXXで、XXXX内容が数字であるときに、数値としての昇順・降順に表示するためにはどうしたらいいのでしょうか。現在は文字コード順に出てきます。

なお、XXXXはVARCHAR(10)です。都合でINTにはしたくありません。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/04/04 00:30:40
  • 終了:2007/04/04 10:18:57

回答(5件)

id:RC30-popo No.1

POPO回答回数345ベストアンサー獲得回数132007/04/04 01:07:17

ポイント20pt

SELECT a ORDER BY CAST(XXXX AS SIGNED)

でソートキーをINTにキャストすれば大丈夫と思います。

http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html

id:mouitchou

SELECT *

ORDER BY CAST( `division` AS SIGNED )

で、#1064 - You have an error in your SQL syntax near 'ORDER BY CAST(`division`AS SIGNED)' at line 1

となります。

2007/04/04 02:46:26
id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342007/04/04 01:12:54

ポイント20pt

ORDER BY CAST(XXXX AS INT)

でいいかも知れません。

http://q.hatena.ne.jp/answer ダミー

id:mouitchou

SELECT * FROM `division` ORDER BY CAST(`division` AS INT)

の発行でやはり

MySQLのメッセージ -->

#1064 - You have an error in your SQL syntax near '( `division` AS INT ) LIMIT 0, 30 ' at line 1

になります。

※phpMyAdmin 2.6.3-pl1

2007/04/04 02:49:49
id:yytamakuro No.3

yytamakuro回答回数3ベストアンサー獲得回数02007/04/04 01:36:36

ポイント20pt

select a order by CAST(xxxx AS int)

とかでどうでしょう?

降順なら

select a order by CAST(xxxx AS int) desc

キャスト関数

http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html

id:mouitchou

CAST(xxxx AS int)がなぜかエラーになります。

(^^;

2007/04/04 02:50:38
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402007/04/04 01:38:02

ポイント30pt

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.5 キャスト関数

SELECT a FROM table ORDER BY CAST(XXXX AS SIGNED);

CAST かな。


ソート用のカラムを別に持ったほうがいいと思うけど。

id:mouitchou

CASTはだめなのです(^^; 理由不明です。

ソート用カラムを考えた方がよさそうですね。


2007/04/04 02:52:04
id:nandedarou No.5

nandedarou回答回数230ベストアンサー獲得回数342007/04/04 02:56:26

ポイント10pt

divisionは、フィールド名ですよね?

FROMの後はテーブル名でないとダメですよ。

SELECT * FROM `ここはテーブル名` ORDER BY CAST(`division` AS INT)

※マイナスの値もあるなら、INTでなく、SIGNEDにして下さい。

http://q.hatena.ne.jp/answer ダミー

id:mouitchou

テーブル名もdivisionで、カラムの一つもdivisionなのです。

2007/04/04 02:58:13
  • id:mouitchou
    回答がほぼ完全に一致しました。CAST(XX as SIGNED)を使うのが標準だということのようですね。当方で何故エラーが出るのかわかりませんが、このラインでもう少し頑張ってみます。
    回答いただいた皆さま、有り難うございました。
  • id:nandedarou
    INTは使えないようです。申し訳ありません。
    私の環境でdivisionというテーブル、divisionというVARCHAR(10)のカラムを作って試したところ、
    SELECT * FROM `division` ORDER BY CAST(`division` AS SIGNED);
    で、エラーはでません。
  • id:b-wind
    syntax Error ということなんで、MySQL のバージョンが低いんじゃないかと推測。
  • id:mouitchou
    バージョンのドキュメントには、
    MySQL mysql-server-4.1.20-1.RHEL4 RPM
    となっています。
    たしかにphpMyAdmin上で
    SELECT cast( `division` AS signed )
    FROM `division`
    を発行してみると、ちょうどcast( )が赤くなってsyntaxエラーとなりますので、どうもcastが問題点で有るようです。ちなみにintも赤くなり、signedは黒です。
  • id:mouitchou
    ついに解決しました。

    先に教えていただいたMySQLマニュアルのCAST( )の項を見なおして、
    SELECT * FROM `division` ORDER BY (`division` + 0.0)
    にしたところ、目的通りに並んで表示されました。
    ご指摘どうも有り難うございました。
    (でも、バージョンが4.1なのになぜでしょうね……。)
  • id:kurukuru-neko

    原因は簡単です。
    文字以外の値が入力されています。

    >SELECT * from a ORDER BY XXXX

    select division as b from division where b not regexp "[1-9][0-9]*";
    を実行して表示されたカラムが
    ありますか?

    show warnings;
    show errors;
    で何かエラーがないか見てください。

  • id:mouitchou
    基本的なことでした。MySQLが3.23.58 でした。

    ドキュメントには4.1と書かれていたのでそう信じていたのですが、phpInfoなどを実行してみると上記バージョンと表示されてしまいました。なんともはや。(+_+)

    そのためと思いますが、
    select division as b from division where b not regexp "[1-9][0-9]*";
    も、せっかく教えていただいたのですが実行できませんでした。
  • id:kurukuru-neko
    以下で対応してみてください。
    select * from division order by (0+division) desc;
  • id:mouitchou
    kurukuru-nekoさんの
    select * from division order by (0+division) desc;
    ( または asc; )
    でうまく動作しました。いちおう念のため「0.0+division」にしています。
    有り難うございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません