電子書籍の厳選無料作品が豊富!

MYSQL5.1を利用しております。
ソート条件で悪戦苦闘しておりまして、何を見てもわからなかったため質問させて頂きます。
=================================================
【hogehogeテーブル】
ID  start_time      end_time
1   2009-8-18 11:00:00  2009-8-18 16:00:00
2   2009-8-18 10:30:00  2009-8-18 14:00:00
3   2009-8-18 09:00:00  2009-8-18 18:00:00
4   2009-8-18 12:00:00  2009-8-18 20:00:00
5   2009-8-18 13:00:00  2009-8-18 20:00:00
=================================================
【SQL文】
SELECT
 *
FROM hogehoge
( start_time <= NOW() AND end_time >= NOW() ) DESC,
( start_time > NOW() AND end_time >= NOW() ) DESC,
( start_time < NOW() AND end_time <= NOW() ) DESC;
=================================================
DESCの1回目は今の時間がstart_time と end_time の間に入っている場合、
DESCの2回目は今の時間がstart_time と end_time よりも大きい時間の場合、
DESCの3回目は今の時間がstart_time と end_time よりも小さい時間の場合です。

修正したい点は、
DESCの1回目をしたときに、その後すぐ、DESCをしたものに対してのみstart_timeの大きい順(降順)に並べ替えたいのです。
イメージとしては下記のようなものでしょうか・・
=================================================
SELECT
 *
FROM hogehoge
( start_time <= NOW() AND end_time >= NOW() ) DESC,
(上でDESCしたものに対してstart_timeの降順に並び替え),
( start_time > NOW() AND end_time >= NOW() ) DESC,
( start_time < NOW() AND end_time <= NOW() ) DESC;
=================================================

色々試してはみたのですが、文法のエラーが出現し、検索してみても本を読んでみても参考に出来るもの見つからず困り果てております。
どうか皆様のお力添えを宜しくお願い致します!

A 回答 (3件)

ちょっとわかりにくかったので一部修正します



ORDER BY X ASC,IF(X=2,start_time,0) ASC,start_time DESC
    • good
    • 0
この回答へのお礼

・・・完璧すぎです。
有難うございます!本当に勉強になりました。
正直、それぞれで分けてデータを取得して、その配列を結合するしかないなぁと今まで思っていました。
SQL文の工夫でここまで出来るものなのですね!(yambejp様にとっては簡単なのでしょうが・・)
まだ、このSQL文を他ですぐ使いまわせるほど理解できたわけではないので(汗)このサンプルをもとに色々やってみます!
本当に有難うございました!!!

お礼日時:2009/08/19 14:07

たとえばこんな感じでどうでしょ?



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
    • good
    • 0

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の降順に並び替え);
=================================================

補足日時:2009/08/18 14:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す