4

いくつかのイベントに関する情報を格納するテーブルがあります。
それらのイベントをリストしたいのですが、今後のイベントを最初に昇順で表示し、過去のイベントを下に降順で表示したいと思います。

私はおそらくこのようなことをしたいと思います:

(SELECT * FROM events WHERE date > NOW() ORDER BY date ASC)
UNION
(SELECT * FROM events WHERE date < NOW() ORDER BY date DESC)

MySQLのドキュメントを確認したところ、UNIONは通常、順序付けされていない行のセットで機能するため、各SELECTを使用した順序付けはまったく役に立たないことがわかりました。どちらのUNIONALLもその仕事をしていないようです。

少しグーグルした後、SELECTが行を生成した順序で行を並べ替える方法はわかりましたが、同じ列で異なる順序で行を並べ替える方法はまだわかりません。

2つのSELECTを実行するだけで十分だと思います。1つは今後のイベント用、もう1つは過去のイベント用です。でも、たった1回のクエリでできるのではないかと思います。
何か提案できることはありますか?

4

2 に答える 2

3

これには は必要ないと思いますUNION。あなたは書くことができるはずです:

SELECT *
  FROM events
 ORDER
    BY CASE WHEN date < NOW() THEN date ELSE NOW() END DESC,
       date ASC
;

CASE WHEN date < NOW() THEN date ELSE NOW() END DESC部分は、ORDER BY今後のイベントが最初に来ることを保証し、過去のイベントが目的の順序で表示されるようにしますが、今後のイベントの相対的な順序には影響しません。そのdate ASC部分は、その部分を処理するフォールバック基準です。

(免責事項:テストされていません。)

于 2012-09-04T18:00:04.540 に答える
0

より一般的な質問に答えると、このUNION操作では、取得された行の順序が保持される保証はありません。特定の順序で返される行を取得するにはORDER BY、クエリで句を使用する必要があります (最も外側の SELECT ステートメント)。

于 2012-09-04T18:26:48.780 に答える