NULL値を含むソート方法とMySQL4.0.20の日本語EUCの文字化けバグについて

このQ&Aのポイント
  • MySQL4.0.20を使用している場合、データをソートする際にNULL値が先に表示される問題が発生します。
  • NULL値を最後に表示して数値のソートを行いたい場合、2回に分けてソートする方法があります。
  • また、MySQL4.0.20では日本語EUCの文字化けバグが存在する可能性がありますが、4.1以降では修正されている可能性があります。
回答を見る
  • ベストアンサー

NULL値を含むソート

MySQL4.0.20を使っています。 以下のようなデータをソートすると NULLが先に表示されます。 これをNULLを最後にして、数値のソートをかけたいです。何か解決策はありますか?2回に分ける方法しかないのでしょうか? nullと非null ◆元データ A --- 5 NULL 2 NULL 3 1 select A from xxx order by A asc; ●望まない結果 A --- NULL NULL 1 2 3 5 ●望む結果 A --- 1 2 3 5 NULL NULL ※話は変わりますが、4.1で日本語EUCの文字化けバグは直っているのでしょうか?

  • MySQL
  • 回答数2
  • ありがとう数10

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

  • ベストアンサー
noname#12943
noname#12943
回答No.2

#1です。 確かに999~っていうのはスマートではないように見えるかもしれません。 しかし、コードの設計上、999~っていうのを使ったりもしています。 たとえば日付などの場合ですね。 そのレコードの適用される終了日が決定されていないときなどに99999999(年月日で8桁の文字列型)などとやって使ったりしています。 ですから、終了年月日が決まっていない場合、この999~をデフォルトの値としてinsertやupdateをしています。 実際にはこれを定数として定義してプログラム中では使用しています。 例) String LAST_DATE = "99999999"; 99999999999(intの11桁MAX値)ではだめなんでしょうか? これならば、これ以上の値となるとけたが12桁ないとダメですよね。 このカラムのデータが何かにもよるのかもしれませんが・・・。

その他の回答 (1)

noname#12943
noname#12943
回答No.1

NULLを調べる関数を使って、最後になる(たとえば9999みたいな)ようにするしかないのではないでしょうか? MySqlを使ったことがないので、具体的にはわかりませんが、↓ここのあたりの関数でいけませんか?

参考URL:
http://www.signal42.com/mirrors/mysql/doc/mysql/ja/Control_flow_functions.html#IDX1235
kounesi
質問者

補足

お答えありがとうございます。 ある程度解決しました。 select null_ga_aru_field, ifnull(null_ga_aru_field, 9999) from aru_table order by 2 asc; これでNULLを最後にして昇順ソートはできましたが、 9999は、この値を超えるもしくは同じ値が出てきそうだし、スマートではないので、MySQLのint(11)型の最大値をセットする関数はあるのでしょうか? よろしくお願いします。

関連するQ&A

  • group by のソート

    mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 table a   b 1   2 3   4 2   4 7   1 2   6 1   6 上のデータから以下のような結果を得たいのですが table a   b  idcount1 1   6    2 3   4    1 2   6    2 7   1    1 グループで集計をとり、その上でbに6がある場合は6その他は bの値にNULLもしくは別の値が入るという形でいいのですが・・・ できません。 SELECT a, b, count( * ) AS idcount1 FROM table GROUP BY a するとはじめに読みこんだ値がbには入ってしまいます。 結果 table a   b  idcount1 1   2    2 3   4    1 2   4    2 7   1    1 SELECT a, b, count( * ) AS idcount1 FROM table where b=6 GROUP BY a するとbの値ははじきますし、カウントしている意味がなくなります。 結果 table a   b  idcount1 1   6    1 2   6    1 GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー 末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • NULLは表示順最下位

    NULLの行を最下位にする場合は、下記のようなコードで解決できました。 select * from table order by case when TEST is null then 0 else 1 end Asc 例)  NULL | 1 3 | 2 1 |→  3 2 |NULL これを、時間(HH:MM)をソートする時に、順番が思うように行きません。 3:20 | 1:10 1:10   |→  9:10 9:10 | NULL NULL | 3:20 上記のような順にソートされてしまいます。  1:10 3:20 9:10 NULL の順にするには、何かよい方法はありませんでしょうか?よろしくお願い致します。

  • MySQLのソートについて

    こんにちわ。 今PHPとMySQLでデータベースの練習をしています。日本語をソートすると変な順番にソートされてしまいます。 SELECT * FROM NAME_T ORDER BY NAME_KANA_C NAME_KANA_Cには名前が全角カナで入力されてます。 これでソートしますと、 テ*** ハ*** ヒ*** フ*** ときて、なぜか シ*** となります。これは何故なんでしょうか? よろしくお願いします。 文字コードはEUCです。

  • PHP+MySQLでのソートについて

    PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。

    • ベストアンサー
    • PHP
  • グループ化したあとソートしたい

    MySQL4.1(Windows)での質問です。 以下のようなテーブルのA列をグループ化して、そのcount(A)の値でソートしたいのですが、エラーになってしまい、実行できません。どうすれば良いでしょうか? テーブル A|B ----- 0|aaa 1|bbb 2|ccc 1|ddd 1|eee 0|fff クエリ select A,count(A) from table group by A order by count(A) 表示させたいデータ A|count(A) ---------- 1|3 0|2 2|1

    • ベストアンサー
    • MySQL
  • Access SQLでnull値のOrderby

    お世話になります、 AccessのSQLについて教えてください。 例えば打率をSQLの中で計算させたとします。その値で Order by して表示させたいのですが、計算結果がnull (打席が0の人)は分母が0になってしまい値が存在しない (null)ですよね、その場合にOrder byを行うとSQLでエラーになってしまいます。 このような場合皆様ならどのように回避されるでしょうか? select B.daritu From (select hit/dasu As daritu From A ) As B Order by B.daritu

  • SELECT文で抽出時に複数カラムのソート方法についてご質問します。

    SELECT文で抽出時に複数カラムのソート方法についてご質問します。 開発環境は以下になります。 ・PHP Version 5.2.11 ・MySQL (5.0) そこでやりたいことです。 レストランの開店時間が、バラバラに入力されるとして 以下のデータがDBに格納されています。 TABLE `reserve` ID,NAME,DATE1,FLAG1,OPEN1,DATE2,FLAG2,OPEN2,DATE3,FLAG3,OPEN3 1,A店,2010-07-05,0,10:00,2010-07-06,1,12:00,2010-07-07,1,10:00 2,B店,2010-07-06,1,13:00,2010-07-07,1,13:00,2010-07-08,1,13:00 3,C店,2010-07-06,0,11:00,2010-07-07,0,11:00,2010-07-08,1,16:00 4,D店,2010-07-04,1,10:00,2010-07-05,0,10:00,2010-07-06,1,10:00 5,E店,2010-07-06,0,13:00,2010-07-07,1,11:00,2010-07-08,0,13:00 5,F店,2010-07-07,1,10:00,2010-07-08,0,10:00,2010-07-09,1,10:00 ・ ・ ・ 種別は ID:主キー NAME:VARCHAR DATE1~3:DATE FLAG1~3:INT OPEN1~3:TIME ※FLAG1~3は、0=店休日、1=営業日です。 ここから毎日の開店状態を、早い開店から順番に表示したいのです。 7月7日の開店状態を表示する場合の結果は 2010年07月07日 A店:10:00開店 F店:10:00開店 E店:11:00開店 B店:13:00開店 ・ ・ ・ このように、開店時間が早い順からソートして出力となります。 そこで以下のセレクト文で呼び出してみると抽出はうまくいきました。 SELECT * FROM `reserve` WHERE `DATE1` = '2010-07-07' AND `FLAG1` =1 OR `DATE2` = '2010-07-07' AND `FLAG2` =1 OR `DATE3` = '2010-07-07' AND `FLAG3` =1 しかし、ソートがうまくいきません。 ORDER BY `TIME1` , `TIME2` , `TIME3` ASC ORDER BY `TIME1` ASC , `TIME2` ASC , `TIME3` ASC ORDER BY `TIME1` `TIME2` `TIME3` ASC そこで、TIME1~TIME3をまとめてインデックスにしてみました。 でもうまくいかないです。 色々と試してみましたがうまくいきません。 根本的に間違えているのでしょうか? データを取り出してから、PHPでソートをかける方が良いのでしょうか? PHPでソートをするには、DBから取り出したデータを、連想配列に変換して ソートしてとなると思いますが。 抽出したデータを表示後、さらに店名でソートして再表示したりという ことを考えているので、出来ればSELECT文で実現したいと思い、 質問させていただきました。 ご教授いただければ幸いです。 何卒よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 検索のソートについて

    以前phpのカテゴリ内で以下のようなQ&Aをみつけましたが、まったく同じ状況で使用する言語がperlの場合どのようにすればいいのでしょうか?どなたか教えて下さい。 "PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。" "shohin.phpで商品一覧を表示するとして、フィールド各名称のリンクを <a href="shohin.php?sort=1">商品ID</a><a href="shohin.php?sort=2">商品名</a>・・・ のようにします。" あとはswitch文を使ってget値(sort=の値)別にクエリーを変えるだけです。

    • ベストアンサー
    • Perl
  • MySqlでのデータソートについて

    MySqlバージョン:5.1.61で、下記のSQLを実行すると、 1件しかデータが無いにも関わらず、EXPLAINの結果で 「Extra: Using where; Using filesort」が発生します。 ---------------- CREATE TABLE IF NOT EXISTS tbl ( user int(11) NOT NULL, item int(11) NOT NULL, prm1 int(11) NOT NULL, prm2 int(11) NOT NULL, prm3 int(11) NOT NULL, PRIMARY KEY (user,item) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO tbl (user,item,prm1,prm2,prm3) VALUES (1,1,10,10,10); EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm1; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm2; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm3; ---------------- ORDER BY句で使用する項目(prm[n])は10項目以上になりますので 10件を超える複合インデックスを張る事は避けたいと考えております。 また、tbl全体のデータは1億件、1userあたり100~200件を想定しています。 複合インデックスを使用せず「Using filesort」を 発生させなくする事はできるのでしょうか?

    • ベストアンサー
    • MySQL
  • ソートと列番号

    データ取得時に列番号を組み込みたい場合 ROW_NUMBER() OVER (ORDER BY ソートキー) で実現できますが、これは実際ソートも行ってくれるのでしょうか? 例えば 1) select dt1,dt2, dt3,ROW_NUMBER() OVER (ORDER BY dt1,dt2,dt3) as dt4 from table_1 2) select dt1,dt2, dt3 from table_1 ORDER BY dt1,dt2,dt3 では同じ順序でデータが取得されるのでしょうか? 簡単にデータを作ってみたところ、同じようなんですが・・・・