• ベストアンサー

複数列でのソート

MySQL4.0で、2つのカラムを比較してソートをしたいと考えています。 cat dog ================== 3   12 ------------> 3 5 2 ------------> 2 7 15 ------------> 7 16 9 ------------> 9 というテーブルがあり、cat列もしくはdog列を比較してどちらか小さい値をキーにしてソートさせたいのです。 上の例だとこんな感じに結果を得たいのですが。。。。 cat dog ================== 5 2 ------------> 2 3 12 ------------> 3 7 15 ------------> 7 16 9 ------------> 9 一度結果セットを配列にいれて、プログラム側で再度ソートをかけようかなと思っていたのですが、できればSQLの側でできないものかと考えています。4.1以降であれば、サブクエリを使ってなんとかできそうなのですが、4.0なので方法がぜんぜん思い浮かびません。どのようにSQLを書けばいいのでしょうか??

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

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

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

LEAST(cat,dog) という関数を使用すれば、小さい方の値が出ます。 この関数が使えれば良いのですが.. ORDER BY LEAST(cat,dog) なんて、できませんかね~??

surinrin
質問者

補足

ありがとうございます!これでいけましたっ! この関数、初めて知りました。もっともっと勉強しないといけませんね。ありがとうございました。

その他の回答 (3)

回答No.4

「動けばいい」なら、#2さんや#3さんの回答でいいと思います。 しかし、「order by」で列名でなく、式を書いた場合、仮にインデクスが定義されていても、MySQLは「ソート抑止」してくれません。 データ件数がどのくらいあるのか不明ですが、こういった操作をSQLでやろうとするなら、RDBMS側での性能向上は図れないことを承知しておいてください。

surinrin
質問者

補足

回答ありがとうございます。データ件数は最大でも100件程度の小さなデータです。where句でさらに絞り込んでいるので、実際に取り出されるのは30件あるかないか、くらいです。 社内にあるサーバーであればRDBMS側の性能向上も視野にいれたいところなのですが、専用サーバーをレンタルしている状況で、しかもそれほどスキルがないので、SQL側でぜんぶまかないたい、というのがホンネです。また、データもそれほど厳密さを要求されるものではないので、なので「とりあえずそれに近いデータがでてくればまぁいいや」といったところでしょうか。RDBMS側にも詳しくなりたいと思ってます。

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

#2さんの方法でいけそうですね。 もうすこし突っ込んでいけば、ORDER BYは結構なんとでもなるものなので SELECT * FROM テーブル ORDER BY IF(cat<dog,cat,dog) なんてのでも動きます

surinrin
質問者

お礼

ありがとうございます。これでもいけましたっ!order by 句ってけっこう万能ですね。order by で IFを使う方法、実ははじめて知りました。いろいろ他にも応用できそうなので、ちょっと勉強してみようと思います。

回答No.1

catとdogのうち小さい方を入れる列を作って、その列でソートしたらいいです。

関連するQ&A

  • 別テーブルのカラムを利用してソートしたい

    別テーブルのカラムを利用してソートしたい MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」のcountというカラムを利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 「tbl2」のidというカラムは外部キーで「tbl1」のidと関係しています。 テーブル「tbl1」 +------+---------+ |   id |  userid  | +------+---------+ |  1  | tanaka  | |  2  | sato   | +------+---------+ テーブル「tbl2」 +------+---------+ |   id |  count  | +------+---------+ |  1  |   10  | |  2  |   3   | +------+---------+ 次のような文かなと思ったのですが、エラーが返ってきます・・・ SELECT * FROM tbl1 ORDER BY (SELECT id FROM tbl2 ORDER BY count)

    • ベストアンサー
    • MySQL
  • 配列のソート

    下記のような形でデータを取得し結果を配列に格納し、 降順にソートしたいのですが、いい方法が見つかりません。いい方法はあるでしょうか。よろしくお願いします。 テーブル構造(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内で文字列を分割して、その値でソートすることは出来ますか? データ) First Name + Last Name が1つのフィールドに入っている。 リストアップ) Last Nameのみを抽出して、ソート。 こんなことは可能でしょうか?

  • 1回のSQLで集計結果順にソートする方法を教えてください

    PHP4+MySQLです。 やりたいことがあるのですが、いいSQLが考えつきません。 お知恵を拝借できれば幸いです。 以下のようなテーブルがあるとします。 ID|ITEMid|DATE 1| 232|2009-06-14 2| 156|2009-06-14 3| 156|2009-06-14 4| 232|2009-06-14 5| 232|2009-06-14 6| 567|2009-06-14 これを次のように集計したいのです。 (ITEMidの登場回数順にソートして、実際の回数も出す) 232:3 156:2 567:1 サブクエリの使えない環境で、1回のSQLで集計することはできるでしょうか。できる場合実際のSQL文を教えていただければ幸いです。 テンポラリテーブル使えば自分でもできそうな気がするので、できれば使わない想定でお願いします。

    • ベストアンサー
    • MySQL
  • 値が「1」のカラム名を求めたい。

    任意の列の、値が「1」のカラム名を求めるにはどうしたらいいでしょうか? PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 そもそものテーブルの作り方がおかしいのかも知れませんが、 以下のようになっています。 このテーブルで、IDが「40」の列の値が「1」のカラム名を求めたいのです。 どの様にしたらいいでしょうか? ※カラム名「会員番号110」は実際は整数になっています。 ID  会員番号110  会員番号111  会員番号112  会員番号113  40  1       1       0       1       41  0       1       1       1   $sql ="select * from `member_sub_tbl` where `ID`='$ID'"; $result = mysql_query($sql, $con); //カラムの数を取得する $numFields = mysql_num_fields($result); for($i=0;$i<$numFields;$i++){ $nameFields[] = mysql_field_name($result, $i); } print_r($nameFields); これで、カラム名は全て配列に入るのですが、値が「1」のと限定する方法がわかりません。 ご教授、よろしくお願いいたします。    

    • ベストアンサー
    • PHP
  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 文字列3次元配列のソート(複数キー)について教えてください

    皆様こんにちは。 ソートについて悩んでおります。 以下の様な表イメージで配列を持っており (実際は要素数は動的に変わります) char AAA[10000][20][10]; /*(10000行20列10文字)*/ これを列毎のキーで昇順/降順と並び替えるプログラムを Cにて実現させたいのですが 検索して調べても2次元はよく載っているのでが、 複数列となるとなかなか無くて、お手上げ状態です。 ・qsortは使えない。 ・安定するソート法にてやらないといけなさそう というのはなんとなく理解できるのですが..... 良い方法をご存知の方いらっしゃいましたら、よろしくお願います。

  • 2つの列を合わせてソートしたい。

    2つの列を合わせてソートしたい。 table名:test 【name】 【area】 【ground】 【bldg】  aaa    3    65.12   84.94  bbb    1    24.6    35.14  ccc    3    112.58  114.5  ddd    2    54     83.14  eee    4    89.25   41  fff     3    74.5    99.10 「ground」と「bldg」はfloat型で、整数と小数点の数値が入っています。 やりたいことは「ground」と「bldg」の2つの列で数値が大きい順でソートしたい。 SELECT * FROM `test` ORDER BY `ground` DESC,`bldg` DESC; こうすると、当たり前な話ですが、「ground」でソートされた後に「bldg」でソートされてしまいます。 そうではなくて、「ground」と「bldg」を合わせて、ソートしたいのです。 【求める実行結果】 【name】 【area】 【ground】 【bldg】  ccc    3    112.58  114.5  fff     3    74.5    99.10  eee    4    89.25   41  aaa    3    65.12   84.94  ddd    2    54     83.14  bbb    1    24.6    35.14 色々と試してみましたが、うまくいかず前に進まない状態です。 何かいい解決法をご存知の方がいらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • MySQL
  • 連想配列のソート

    次のような連想配列があります。 $buff[0][0]=1; $buff[0][1]=567; $buff[0][2]=134; $buff[0][3]="文字列"; $buff[1][0]=2; $buff[1][1]=246; $buff[1][2]=537; $buff[1][3]="文字列"; $buff[2][0]=3; $buff[2][1]=897; $buff[2][2]=334; $buff[2][3]="文字列"; ~ 要するに キー,数字,数字,文字列 が並んでいて、キーと値を保持したまま真ん中の数字二つを使ってソートしたいのですが、どのようにすればいいでしょうか。 asort($buff[1], SORT_NUMERIC); reset ($buff[2]); asort($buff[2], SORT_NUMERIC); reset ($buff[2]); のように試してみたのですが、まったく並びは変わりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ソート(PL/SQL)

    おはよーございます。 今PL/SQLを使っているのですが、まだ関数(?)とかよくわかんなくて、困ってます。 レコードの索引付き表(二次元配列)の中の、このカラムを使ってソートしたい!、というときはどうしたらいいんですか? ちょっと言葉が足りないかもしれないので補足しますので、実装方法を教えてください。 よろしくお願いします(ペコリ)