- ベストアンサー
複数列でのソート
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を書けばいいのでしょうか??
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
LEAST(cat,dog) という関数を使用すれば、小さい方の値が出ます。 この関数が使えれば良いのですが.. ORDER BY LEAST(cat,dog) なんて、できませんかね~??
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
「動けばいい」なら、#2さんや#3さんの回答でいいと思います。 しかし、「order by」で列名でなく、式を書いた場合、仮にインデクスが定義されていても、MySQLは「ソート抑止」してくれません。 データ件数がどのくらいあるのか不明ですが、こういった操作をSQLでやろうとするなら、RDBMS側での性能向上は図れないことを承知しておいてください。
補足
回答ありがとうございます。データ件数は最大でも100件程度の小さなデータです。where句でさらに絞り込んでいるので、実際に取り出されるのは30件あるかないか、くらいです。 社内にあるサーバーであればRDBMS側の性能向上も視野にいれたいところなのですが、専用サーバーをレンタルしている状況で、しかもそれほどスキルがないので、SQL側でぜんぶまかないたい、というのがホンネです。また、データもそれほど厳密さを要求されるものではないので、なので「とりあえずそれに近いデータがでてくればまぁいいや」といったところでしょうか。RDBMS側にも詳しくなりたいと思ってます。
- yambejp
- ベストアンサー率51% (3827/7415)
#2さんの方法でいけそうですね。 もうすこし突っ込んでいけば、ORDER BYは結構なんとでもなるものなので SELECT * FROM テーブル ORDER BY IF(cat<dog,cat,dog) なんてのでも動きます
お礼
ありがとうございます。これでもいけましたっ!order by 句ってけっこう万能ですね。order by で IFを使う方法、実ははじめて知りました。いろいろ他にも応用できそうなので、ちょっと勉強してみようと思います。
- shirayukix
- ベストアンサー率43% (90/207)
catとdogのうち小さい方を入れる列を作って、その列でソートしたらいいです。
補足
ありがとうございます!これでいけましたっ! この関数、初めて知りました。もっともっと勉強しないといけませんね。ありがとうございました。