- ベストアンサー
MYSQL5.1で特定の条件でソートする方法について
- MYSQL5.1を利用している際に、特定の条件でソートする方法がわからず困っています。
- 具体的には、ソート条件を複数指定し、ソート後にさらに別の条件で再度ソートしたいです。
- 現在のSQL文ではエラーが発生しており、解決策を探しています。皆様のお力添えをお願いします!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとわかりにくかったので一部修正します ORDER BY X ASC,IF(X=2,start_time,0) ASC,start_time DESC
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
たとえばこんな感じでどうでしょ? SET @NOW:=NOW(); SELECT * ,IF(@NOW BETWEEN start_time AND end_time,1,0) +IF(@NOW >end_time,2,0) +IF(@NOW <start_time,3,0) AS X FROM hogehoge ORDER BY X ASC,(X=2)*start_time ASC,start_time DESC
- yambejp
- ベストアンサー率51% (3827/7415)
3回ソートするのではなく、まとめちゃえば? SET @NOW:=NOW(); SELECT * ,IF(@NOW BETWEEN start_time AND end_time,1,0) +IF(@NOW >end_time,2,0) +IF(@NOW <start_time,3,0) AS X FROM hogehoge ORDER BY X ASC,start_time DESC ※デバッグしやすくするために、NOW()を直接使わず 変数におとしてあります。
補足
>>yambejp様 すごいの一言です。。実現できてしまいました! 実際は、下記のように2回目のDESCに対してのみstart_timeの降順にしなければいけないのですが、yambejp様から頂いたサンプルを参考にしてやってみても、結局思うようにいかず・・・ お時間のあるときで構いませんので、あと一押し、この無知な私にお力をお願いできませんでしょうか? ================================================= SELECT * FROM hogehoge ( start_time <= NOW() AND end_time >= NOW() ) DESC, (すぐ上でDESCしたものに対してstart_timeの降順に並び替え), ( start_time > NOW() AND end_time >= NOW() ) DESC, (すぐ上でDESCしたものに対してstart_timeの昇順に並び替え), ( start_time < NOW() AND end_time <= NOW() ) DESC, (すぐ上でDESCしたものに対してstart_timeの降順に並び替え); =================================================
お礼
・・・完璧すぎです。 有難うございます!本当に勉強になりました。 正直、それぞれで分けてデータを取得して、その配列を結合するしかないなぁと今まで思っていました。 SQL文の工夫でここまで出来るものなのですね!(yambejp様にとっては簡単なのでしょうが・・) まだ、このSQL文を他ですぐ使いまわせるほど理解できたわけではないので(汗)このサンプルをもとに色々やってみます! 本当に有難うございました!!!