• ベストアンサー

varcharでの最大値抽出

すいません。お教えください。 Mysql5.0.15で以下のテーブルを作成した時、数値の最大値(1010)を抽出したいのですがどのようにすれば抽出できるのでしょうか?お教えください。 テーブル名:B フィールド名,フィールドタイプ,備考 b_id,int(10),auto_increment b1,varchar(10) b_id,b1 1,999 2,1000 3,1000-1 4,1010 5,800 重ねて質問させてください。 select max(b1) from b;とした場合 999としか表示されません。 これもなぜなんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

まぁ回答は気付かれたようですがこんな感じで・・・ SELECT * FROM `B` ORDER BY LENGTH(`b1`) DESC,`b1` DESC LIMIT 1 よくよく考えたら、castしちゃえば3番があっても機能しますね SELECT MAX(CAST(`b1` AS SIGNED)) FROM `B`

kagorou
質問者

お礼

yambejpさん回答ありがとうございます。 CASTという方法もあるんですね。 勉強になります。 本当にひとつの質問でいろいろ勉強になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

横からですが。 >もう少しyambejpさん聞いてもいいでしょうか? >>3のように式が入っていると厄介、それがないなら桁数をベースに >>処理することもできるかも length関数で桁数を拾えるので、それで桁数での大小が分かるので、max関数なり、order byとlimitなどを組み合わるといった方法があります。 length関数を使う以外に、lpadで'0'を埋め込むといった方法もあるでしょう。 ところで、3番めの'1000-1'は、数値とは言いません。何をやりたいのでしょうかね?

kagorou
質問者

お礼

chukenkenkouさん 今回の質問でいろいろ勉強になりました。 回答ありがとうございました。

kagorou
質問者

補足

すいません。今度はコメント入力の行き違いになっていしまいました。 chukenkenkouさんコメントありがとうございます。 >もう少しyambejpさん聞いてもいいでしょうか? >>3のように式が入っていると厄介、それがないなら桁数をベースに >>処理することもできるかも に関しては、以下の部分で自分なりに解決しました。  回答日時:09/05/07 15:53回答番号:No.1  この回答への補足 重ねて >length関数で桁数を拾えるので、それで桁数での大小が分かるので、max関数なり、order byとlimitなどを組み合わるといった方法があります。 この方法があることも勉強になりました。ありがとうございます。 >ところで、3番めの'1000-1'は、数値とは言いません。何をやりたいのでしょうかね? の件ですが、確かに数値ではありません。 1000番というものの枝番の1という意味あいで記載をしました。 数値でないことはわかっているのですが、質問をする際にこういうものも処理できるのか出来ないのかも知りたくてこのような記載をしました。 chukenkenkouさんからの回答で、私の説明不足だなと反省しています。すいません。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

varcharは文字列ですから、文字列を頭から比較していく限り 999がヒットするのは自明ですね。 3のように式が入っていると厄介、それがないなら桁数をベースに 処理することもできるかも 真剣にやるならもう一つ計算結果をintなりdoubleで保存しておく フィールドを用意すべきです。

kagorou
質問者

お礼

yambejp早速の回答ありがとうございます。 目から鱗です。納得しました。ありがとうございます。 この回答を聞いて新たに疑問に思ってしまったことがあるので もう少しyambejpさん聞いてもいいでしょうか? >3のように式が入っていると厄介、それがないなら桁数をベースに 処理することもできるかも と書かれていますが、3番がない場合どういう処理方式になるのでしょうか?! ご存知の範疇でお教えいただくとありがたいです。

kagorou
質問者

補足

すいません。教えてgooの使い方を間違えてしまいました。 yambejpさん「この回答へのお礼」の後の内容を「この回答への補足」でさせてもらいます。 >>3のように式が入っていると厄介、それがないなら桁数をベースに >>処理することもできるかも >と書かれていますが、3番がない場合どういう処理方式になるのでしょうか?! >ご存知の範疇でお教えいただくとありがたいです。 上記の件ですが自己解決しました。 そのあとGoogle等で検索をして以下の方法で出来ることを確認しました。 LPAD関数で桁数をそろえてそれをMAX関数で最大値を算出するという風にすればいいと書いてありました。 SELECT max(LPAD(b1,7,0))FROM b いろいろとご指導ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MySQL5.1で varchar(100)のものを varchar(

    MySQL5.1で varchar(100)のものを varchar(90)にする予定です。 (後ろの10バイトは無条件になくなっても構いません) 通常の手順ではalter tableを使います。 今回は、他の項目も変更(auto_incrementやキーの追加)するので 一度 mysqldumpでSQLを吐き出して、 CREATE文の以下を変更 varchar(100) → varchar(90) auto_incrementやキーの追加 そして、mysqlでリストアします。 この方法は、アリでしょうか? 他のデータベース(PostgreSQL, SQLServer, Oracle)でも使える手法でしょうか? 皆さんのvarchar(100) → varchar(90)する方法が知りたいです。

    • ベストアンサー
    • MySQL
  • MySQLのselect文で、最大ID値のデータを呼び出す

    MySQLのテーブルのフィールド名として「ID」を登録しています。(型はint) そこで、select文で最大ID値のデータを呼び出すにはどうすればいいのか教えて頂けないでしょうか? select * from tableA ?????;

    • ベストアンサー
    • MySQL
  • MySQL関数max()を条件にSELECTできませんか?

    MySQL5.0を使っています。 次のようなテーブル(items)があるとします。 name(varchar)|number(int) --------------------------- itemA | 5 itemB | 2 itemC | 3 ここからnumberの最大値を持つnameを抽出したいのです。 SELECT max(number) FROM items とすると当然「5」が返ってきますが、このmax(number)を条件にしてitemを抽出することはできないのでしょうか? よろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 同じ値が存在しないレコードの抽出方法について

    下記のテーブルの中で、 b_tableテーブルのidフィールドの値が1つしかない(重複していない)フィールドを抽出したいと思います(この場合ですが、3002と3004を抽出したいです)。 その際、抽出条件を下記の【※※※ここに記述を追加※※※】に記述することで実現したいと思ったのですが、その場合どのようなsql文を書けば良いか分かりませんでした。 その為、このような場合、どのようなsql文を書けば良いかご存知の方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 なお、【※※※ここに記述を追加※※※】に記述を追加したい理由ですが、既存のSQL文にこの条件を追加したいのですが、WHERE以前は別の部分に記述されており、その部分が変更できない為です。 なお、下記のWHERE以前の記述はあくまでサンプルであり、重複していないフィールドを抽出するSQL文と直接関係のない記述でしたら、変更していただいても大丈夫かもしれません(この点曖昧で申し訳ございません。移植元の記述ではテーブルを連結しているように見受けられたため、連結の仕方が多少変わる分には問題ないのかなと思っています。この点については実際にソースをご提示いただければ、それを元に移植させていただいた上で、ご回答差し上げたいと思います)。 ■SQL文 SELECT a.id FROM `a_table` AS a LEFT JOIN `b_table` AS b ON a.id = b.id WHERE 【※※※ここに記述を追加※※※】 ■a_tableテーブル CREATE TABLE IF NOT EXISTS `a_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `a_table` (`auto_id`, `id`) VALUES (101, '3001'), (102, '3002'), (103, '3003'), (104, '3004'); ■b_tableテーブル CREATE TABLE IF NOT EXISTS `b_table` ( `auto_id` int(3) NOT NULL, `id` varchar(4) NOT NULL, `no` varchar(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `b_table` (`auto_id`, `id`, `no`) VALUES (101, '3001', '1'), (102, '3001', '2'), (103, '3001', '3'), (104, '3002', '2'), (105, '3003', '1'), (106, '3003', '2'), (107, '3004', '1'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLでvarchar型のデータの最大値を取得する方法

    お世話になります。 どなたかご回答&アドバイスをよろしくお願い致します。 MySQLで、以下のように登録されているデータがあるとします。 ID(varchar) | name(varchar) 0000001 | ああああ 0000002 | いいいい 0000004 | ううううう それで、登録されているIDの最大値+1を取得したいのです。 IDのカラムのデータ型がIntならmaxで取得できると思うのですが、データ型がvarcharなので…。 レコードの数+1というのは、IDが必ずしも1から飛びがなく登録されているとは限らないので、 その方法は危ないのでできません。 上の例だと、「0000005」を取得したいです。 どうぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • テーブルの内容とテーブルのカラムの件数

    以下のようなテーブルがあります。 そのテーブルの内容と、そのテーブルのあるカラムの件数を条件にして抽出したいのですが、どのように指定すればよろしいでしょうか? テーブルA id(int) AUTO_INCREMENT, user_id(varchar), price(int), date(datetime) 表示したい一覧 user_id | date | price A | 2014-03-10 10:00:00 | 2600 B | 2014-03-11 11:00:00 | 2720 A | 2014-03-13 12:00:00 | 2500 C | 2014-03-14 15:00:00 | 2860 B | 2014-03-18 13:00:00 | 2450 A | 2014-03-19 19:00:00 | 2550 ・・・ などのレコードがあった場合、 user_idが同じ場合のレコード数が2~5の場合等を抽出したいと思います。 うまく表現できませんが、このような場合の抽出の仕方をわかる方、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL 複数フィールドで不一致の抽出

    ジャンル  id ジャンル名 日 数 id ----+---------------+--------------+---------+------- 001 ワンピース 20110518 10 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110518 5 b002 仮に、このようなデータがあったとします。 数時間後には、↓のように変更がかかって送られてきます。 001 ワンピース 20110519 7 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110519 9 b002 データ配布元の問題で、内容が更新された時点で、まだデータが確定していないものは、前日のデータが混ざって送られてきます。 この仕様を改良することは、残念ながら全く不可能です。 しかし、このデータをそのままテーブルに取り込んでしまうと、当然、2行目が重複してテーブルに収まってしまい、その後のデータ抽出に支障がでます。 例の場合でいえば、既に存在している2行目のデータを捨て、1行目と3行目のみを抽出する方法を探しています。 そこで、全部のデータを持つのをテーブル1とし、新しく着いたデータ(0519を含む方)をテーブル2に一時保管て、 SELECT テーブル2.ジャンルid, テーブル2.ジャンル名, テーブル2.日, テーブル2.数, テーブル2.ID FROM テーブル2 LEFT JOIN テーブル1 ON (テーブル2.ID = テーブル1.ID) AND (テーブル2.数 = テーブル1.数) AND (テーブル2.日 = テーブル1.日) AND (テーブル2.ジャンルid = テーブル1.ジャンルid) WHERE (((テーブル1.ジャンルid) Is Null)); と不一致SQLをAccessで行ったところ、1行目と3行目までが抽出できました。 ジャンルid、日、数、id が一致しないものを取りだすという不一致クエリの改造です。 ところが、同じSQLを、本番であるMySQLで行ったところ、データが抽出できす、反応が無くなってしまいます。 サンプルでは件数を絞りましたが、実際には1回分のデータが1万件近くあり、さらにメインテーブルは60万件ほどになるため、量が多すぎるためとも思いますが、4時間経ってもクエリの結果が返って来ないのは、MySQLとなにか合わないのではないかと思います。 MySQLで、上記と同じく、ジャンルid、日、数、id の全てが一致しないデータを抽出する事は可能でしょうか? ちなみに、MySQLテーブルでは、idの前にインクリメントのフィールドを置き、インデックスもインクリメントのフィールドで作成してあります。 よろしくお願いします。

  • テーブルの最後(最新)のレコードを抽出したい

    宜しくお願いします。 PHP MYSQL の組み合わせで使っています 以下のようにして、最後のレコードを取り出したいのですが まったく違う事をしているのかもしれません。 $sql =" select * from テーブル where フィールド='max' " ; フィールドはauto_incrementで番号を振っています。 これで最大のつもりなのですが・・・。 他にも、レコードを入れた時間も記録したフィールドがあるのですが どうしてよいか?判りません。 テーブルの最新のレコードを出したいのです。 **その中の一つのフィールドを取り出すのですが、   それはうまくいっているみたいです    (max の所に数字を入れると表示します) お手数かけますが、どなたかご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 日付は最大で、それに対する残高を抽出するには?

    アクセスのクエリについて質問です。 宜しくお願いいたします。 テーブル1の構成 フィールド名 ID(オートナンバー) 会社名 (テキスト型) 最終更新日(日付型) 残高(数値型) --------------------------------- ID 会社名 最終更新日  残高 1 A会社  2012/11/02 8000 2 B会社  2012/11/01 5000 3 A会社  2012/11/01 10000 4 B会社  2012/10/31 12000 -------------------------------- です。 クエリで、最終更新日が一番新しい残高を返したいのですが どのようなSQL文を作ればよろしいでしょうか? 結果としては、 会社名 最終更新日 残高 A会社 2012/11/02  8000 B会社 2012/11/01  5000 と選択クエリで表示させたいです。 ---------------------------------------------------------------- SELECT テーブル1.会社名, Max(テーブル1.最終更新日) AS 最終更新日の最大, テーブル1.残高 FROM テーブル1 GROUP BY テーブル1.会社名, テーブル1.残高; ---------------------------------------------------------------- としたら、 会社名 最終更新日の最大 残高 A会社 2012/11/02    8000 A会社 2012/11/01    10000 B会社 2012/11/01    5000 B会社 2012/10/31    12000 のように、全ての日付のデータが表示されてしまいました。 最終更新日以外の日付は要らないです。 クエリのデザインビューで集計を「先頭」にしても同じでした。