• ベストアンサー

複数列でのソート

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を書けばいいのでしょうか??

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

  • ベストアンサー
回答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のうち小さい方を入れる列を作って、その列でソートしたらいいです。