select文でソート規則が2つあるとき

このQ&Aのポイント
  • select文でソート規則が2つある場合の並べ替え方法を教えてください。
  • idとsortの2つのカラムを持つテーブルのデータを、sortの昇順で並べ替えたいですが、同じidのものはまとめて取りたいです。
  • idを第一要素にしてもsortの昇順が反映されないし、sortを優先すると同じidのものを連続して取ることができません。どうしたら両方を叶えられるでしょうか?
回答を見る
  • ベストアンサー

select文でソート規則が2つあるとき

失礼致します。 分かったら教えてください。 今テーブルにid,sort,infoと3つカラムがあり以下のデータが入っています。 id,sort,info (B,1,日本) (B,1,韓国) (A,2,日本) (C,3,ロシア) (C,3,モンゴル) (B,4,中国) このinfoはあまり重要でないので(他2項目が同一の場合の識別子です。)気にしないで下さい。 これを以下のように並べ替えたいです。 (B,1,日本) (B,1,韓国) (B,4,中国) (A,2,日本) (C,3,ロシア) (C,3,モンゴル) 何をしているかというと、 基本的にはsortのascで並べるのですが、同じidを持つものに関しては まとめて取ってきたいのです。 これを考える際、idをorder byの第一要素にするとsortの順序が反映されないし、sortを優先すると同じidのものを連続して取ることができません。 両方を叶えるために何かいい方法は無いでしょうか?

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

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

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

MySQL5系であればサブクエリをつかってこんな感じでどうですか? SELECT t.id,t.sort,t.info FROM `テーブル` as t INNER JOIN (SELECT id,MIN(sort) AS minsort FROM `テーブル` GROUP BY id ORDER BY minsort) AS s USING(id) ORDER BY minsort,sort

その他の回答 (1)

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

この例ではたまたまユニークデータに成っていますが 仮にc,1とかがはいっていたらb,1と競合しますね? どうするんですか? 仮にぜったいに重ならない前提だとしてMySQLのバージョンによって やりかたが違います。 バージョンいくつをご利用でしょうか?

japan_3
質問者

お礼

ご回答ありがとうございました。 SQL側での制御は難しそうなので、 idとsortのいずれかが違うデータは入らなくしました。 (B,1)があれば(B,1)と(notB,not1)しか入りません。 こうすることでsortによるソートでOKとなりました。 ☆ありがとうございました☆

japan_3
質問者

補足

ご回答ありがとうございます。 MySQLは5.2.Xを使ってます。 また、idが同じでsortが違うデータはあっても sortが同じでidの違うデータはありません。 sortが同じものは必ずidも同じです。 よろしくお願いします。

関連するQ&A

  • クライアントの自由にソートする

    お世話になっております。 現在データベースの中に下記のようなデータが存在するとします。 A B C D 1 2 3 4 (Aのカラムに1) (Bのカラムに2) と言う具合にデータが入っています。 そこで質問なのですが、クライアントの自由にABCDのカラム内のデータをソートさせるにはどのようにしたらよいでしょうか? 現在は、データベースのテーブルを下記のようにする対処方法しか思いつかないのですが、できれば上記テーブル構成のままソートさせたいのですが何か良い方法は御座いませんでしょうか? 例)  クライアントがA D B C の順にソートしたい場合 テーブル名:TB1 A  1  順位1 B  2  順位3 C  3  順位4 D  4  順位2 select * FROM TB1 A ORDER BY 順位 ASC 出力: 1 4 2 3

  • 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
  • select文

    お世話になります。 以下のような内容のテーブルA、B、Cがあります。 テーブルA  id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N テーブルAとテーブルCは「id」がキーで1:N このような3のテーブルで idを検索キーにして次のフィールドのデータを抽出したいのですが。。。(テーブルCのc_dateを降順で) id a_data a_date テーブルBのidで検索したレコード数 説明不足かもしれませんがよろしくお願いします。

  • select文の書き方

    助けてください……(T-T) oracleをつかっていますが、SQLが苦手すぎて、どうしたらいいか分かりません。。。 解決策をご存じの方、教えていただけないで しょうか? テーブルは下記の2つがあります。 (1)Aテーブルの1カラムに、複数の商品IDを格 納している(カンマ区切り) (2)Bテーブルには、商品ID&商品名の一覧が ある このAテーブルの商品ID列に番号から、Bテー ブルの商品名を取得したいです。 ■Aテーブル no | 商品ID 1001 | 1、2 1002 | 1、2、3 1003 | 3 ■Bテーブル 商品ID | 商品名 1 | 商品A 2 | 商品B 3 | 商品C ■とりたいデータの形 1001 | 商品A、商品B 1002 | 商品A、商品B、商品C 1003 | 商品C カンマ区切りで格納しているとin句は使えな いと知りました。。 テーブルにカンマ区切りで格納することは、 変えることはできませんし、 SQLで1回で取得しなきゃいけないのです。 そんなこと、可能なのでしょうか。。 明日の朝までに教えていただければ、 すごくすごく助かります。。 すみませんが、宜しくお願いします。

  • こんなソートがしたいです。教えてください!

    エクセル2003で 下記のようなデータをソートし、 【ソート前】 2208550 92059184 92059174 92059174B 92059174A 92059174C 1348535 19777225 2519034 2519034D 2519034B 2519035A 2519035C 【ソート後】 1348535 19777225 2208550 2519034 2519034B 2519034D 2519035A 2519035C 92059184 92059174 92059174A 92059174B 92059174C 上記ソート後の結果を得られるマクロを作りたいです。 よろしくお願いいたします。

  • 2007/1/15形式をソートしたい

    予約カレンダーを作っています。 ユーザーは不特定の日を予約できます。 CSVファイル 2,1029,2007/1/15,C, 3,1029,2007/1/15,B,checked 4,1029,2007/1/10,D, 5,1029,2007/1/9,C,checked 6,1029,2007/1/16,D, 8,1023,2007/1/17,D 9,1023,2007/1/24,D 10,1023,2007/1/24,C 11,1023,2007/1/10,D ID,会員番号,日付,ステータス,承認 ソートがうまくいかず上記のように並んでいます。 理想としては 9,1023,2007/1/24,D 10,1023,2007/1/24,C 8,1023,2007/1/17,D 11,1023,2007/1/10,D のように日付が新しい方を上にして書き込みたいのです。 2007/1/24のところのソートが上手くいきません。 また、IDの順序も変わると新しいIDをつけるときに困りそうです。 なにかいい方法があったら教えてください。

    • ベストアンサー
    • Perl
  • 条件付ソートについて

    SQL文で条件付のソートについて教えてください。 テーブルA(id, data_a, data_b)があったとき、 data_aとdata_bのうち、値が大きいほうのデータでソートするためのSQL文が知りたいのです。 例えば以下のようなデータが入っていたとき、 id,date_a,date_b 1, 10, 0 2, 20, 40 3, 30, 30 4, 90, 15 以下のような結果になるようにソートしたいのです。 id,date_a,date_b 1, 10, 0 3, 30, 30 2, 20, 40 4, 90, 15 良い方法があれば教えてください。 よろしくお願いします。

  • ハッシュのソート

    ハッシュに以下のようなデータが格納されている場合 valueでソートして表示するにはどうしたらよいでしょうか? 教えてください。 %hoge = (a => 10, b => 3, c => 7); 表示 a => 10 c => 7 b => 3

    • ベストアンサー
    • Perl
  • 配列のソートについて

    配列をソートした時、もともとデータのあった配列番号を記憶しておきたいのですが いい方法はないでしょうか (31,55,84,20,96,14); //1 2 3 4 5 6 ↓ (14,20,31,55,84,96) //6 4 1 2 3 5    ※ソート前の配列番号 いくつかの行(配列A)の、違う列にあるデータを抜き出して配列Bにまとめた後、配列Bをソート その後、配列Bのもともとの順番の位置の行にあるデータを上からコピーしていく感じで行ごとのソートを考えています イメージはこんな感じです a[0]=[1,512,200]; a[1]=[3,100,1]; a[2]=[4,100,265]; a[3]=[8,300,1]; //ソート対象を抜き出す b[0]=a[0][1]; b[1]=a[1][2]; b[2]=a[2][0]; b[3]=a[3][1]; b.sort(); c[0]=a[b[0]のソート前の配列番号]; c[1]=a[b[1]のソート前の配列番号]; c[2]=a[b[2]のソート前の配列番号]; c[3]=a[b[3]のソート前の配列番号];

  • 多段ソート

    C言語というよりはアルゴリズムの話です。 [名前], [生年月日] の2つのカラムで表される固定長の行データが羅列されたファイルがあります。 また、各カラムを比較して行をソートした場合にどの行が何番目にくるかといったインデックス情報を木構造で保持したファイルがあります。 (このファイルは行データの追加・削除時に更新される) これらのファイルを利用して、生年月日でソートし、かつ日時が同じ場合は名前順にソートした場合の上から10個分だけのデータを取り出したいのですが、効率のよい方法は無いでしょうか? 全データを読み込んでから、バブルソート等の順序を崩さないソートを多重にかけることはなるべく避けたいのです。 そのためにソート済みのインデックス的な役割を持つファイルを用意しているのですが、多段ソート時にどう応用すればよいのかわからなくなってしまいました。 例 日時、名前の順にソートされた上4つ分のデータが欲しい。 【一覧】 [1行目] 10/20, Aさん [2行目] 11/30, Fさん [3行目] 9/10, Cさん [4行目] 11/30, Bさん [5行目] 12/10, Dさん 【生年月日でソートされた インデックス】 9/10, 3行目 10/20, 1行目 11/30, 2行目 11/30, 4行目 12/10, 5行目 【名前でソートされた インデックス】 Aさん, 1行目 Bさん, 4行目 Cさん, 3行目 Dさん, 5行目 Fさん, 2行目 得たい結果 [3行目] 9/10, Cさん [1行目] 10/20, Aさん [4行目] 11/30, Bさん [2行目] 11/30, Fさん