クライアントの自由なデータソートについて

このQ&Aのポイント
  • データベースのテーブル構成を変更せずに、クライアントが自由にABCDのカラム内のデータをソートする方法について調査しています。
  • 現在の対処方法では、テーブルを変更して順位カラムを追加する必要がありますが、他の方法を模索しています。
  • 例えば、順位を考慮せずにクライアントが指定した順序でデータを取得する方法などがあれば教えてください。
回答を見る
  • ベストアンサー

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

お世話になっております。 現在データベースの中に下記のようなデータが存在するとします。 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

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 もしかして、質問の趣旨を誤解しているかもしれません。その節はご容赦を。  具体的な名前にすると、たとえば、住所・氏名・電話番号が入ったテーブルがあって、これを、あるユーザーは、「住所・氏名・電話番号」の順番で出したいし、別のユーザーは、「氏名・住所・電話番号」と出したいとか・・・そういう意味でしょうか?  とすれば、これは一つの固定したSQLでやるには無理があるように思います。  たとえば、  select A B C D from TB;  とすれば、出力は、  1 2 3 4  となりますし、  select A C D B from TB;  とすれば、出力は、  1 3 4 2  となります。  では、これを可変にするには、アプリケーションで、ユーザーの要求にあわせて、その場でSQL文を構築してそれをデータベースに発行するしかありません。  アプリの言語がわからないので抽象的になりますが、  "select "と  フィールド名をスペース区切りで希望の順番に並べた文字列  " from TB;"  の3つの文字列を連結して、この結果をSQL文としてデータベースに渡すというカタチです。(動的SQLといいます)

sadoru
質問者

お礼

ご返信ありがとう御座います。 全く誤解はされておりません。助かりました。 ご指示して頂いたことをヒントに下記のように作成致しましたら解決致しました。 ありがとう御座います。 また何かありましたらよろしくお願い致します。 クライアントが希望の順位を予め入力する。 テーブル名 : ORDER1 順位1 | 順位2 | 順位3 | 順位4 A | D | B | C テーブル名 : TB1 (ORDER1の順位通りソートさせる) A B C D 1 2 3 4 Select 順位1 , 順位2, 順位3, 順位4 from ORDER1 Select "&順位1&" , "&順位2&" , "&順位3&" , "&順位4&" from TB1 以上で、クライアントの希望通りにソートができました。ありがとう御座います。

関連するQ&A

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

    エクセル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 上記ソート後の結果を得られるマクロを作りたいです。 よろしくお願いいたします。

  • 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
  • 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
  • エクセル マクロ VBA での部分参照ソート

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

  • 多段ソート

    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さん

  • 配列のソート

    下記のような形でデータを取得し結果を配列に格納し、 降順にソートしたいのですが、いい方法が見つかりません。いい方法はあるでしょうか。よろしくお願いします。 テーブル構造(test) ID|name |point|area| ==================== 1 |Aさん|56 | A | 2 |Bさん|12 | B | 3 |Cさん|24 | B | 4 |Dさん|34 | B | $sql = "select * from test"; $result = mysql_query($strSQL); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { ここで配列に格納 } 配列への格納方法と、pointの降順にソートする 方法が知りたいです。 最終的に、Aさん、Dさん、Cさん、Bさんと なるようにしたいです。

    • ベストアンサー
    • PHP
  • 【SQL文】このような結合UNION?できますか?

    SQL文でテーブルを結合し、insertしたいと思っています。 例) テーブル名:tb1, カラム:A1,A2 テーブル名:tb2, カラム:B1(b1,b2,b3,,,,) テーブル名:tb3, カラム:C1(c1,c2,,,,,,) tb2とtb3を結合させてtb1へinsertしたいと思いますが、 tb2とtb3リレーションを組める要素がありませんし、データの型も違います。 |A1 | A2 __|____|_____ 1 |b1 |c1 _____________ 2 |b1 |c2 _____________ 3 |b2 |c1 _____________ 4 |b2 |c2 _____________ 上記のような結果を作ってtb1へINSERTしたいのですが、UNION結合を使えるのか どうかすらわかりません。ネットで調べたのですが、突破孔を見つけることができ ませんでした。 ちなみにACCESSで結合までの結果を得るのに、SELECT B1.tb2,C1.tb3 from tb2,tb3 という文で出せましたが,mySQLではダメでした。 どなたかご教授おねがいできますでしょうか?

    • ベストアンサー
    • MySQL
  • 配列のソートについて質問です。

    配列のソートについて質問です。 2つのキーで配列の中身をソートしたいのですが、スマートな書き方があれば教えてください。 そもそも間違っている、などのご指摘でもありがたいです。 @t1 = map {(split /,/)[1]} @data; @t2 = map {(split /,/)[2]} @data; @data = @data[sort {$t1[$a] <=> $t1[$b] or $t2[$a] <=> $t2[$b]} 0 .. $#t1]; @dataの内容 A,1,2 B,1,3 C,2,1 D,3,2 E,3,1 F,1,1 出力結果 F,1,1 A,1,2 B,1,3 C,2,1 E,3,1 D,3,2 よろしくお願いします。

    • ベストアンサー
    • 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]のソート前の配列番号];

  • 二次元配列のソートについて

    PHPでデータベースの複数のテーブルから ID、名前、かな、点数といったデータを 読み込んでテーブルに保存しています。 SELECT id, name, kana, tensu FROM a, b, c ORDER BY tensu といった形で出来ると思っていたのですが エラーが出てできませんでした。 そこで各テーブルのデータを 読み込んで二次元配列にしてソート してみたのですが、なぜか以下のソースだと データが重複されて表示されて 困っています。 $saidai = count($tbl); for ($i=0 ;$i<$saidai;$i++){  $sort[$i] = $i; } for($i=0;$i<$saidai;$i++){  for($j=0;$j<$saidai;$j++){   if($tbl[$sort[$i]][2] > $tbl[$sort[$j]][2]){    $work = $sort[$i];    $sort[$i] = $sort[$j];    $sort[$j] = $work;   }  }  表示 } こんな感じですがどうも繰り返しても 同じデータばかりが表示されます。 いろいろ試してみましたが結局出来ませんでした。 表示するデータがかぶらないようにするには どうすればよろしいですか? お願いいたします。

    • ベストアンサー
    • PHP