2017-03-17 3 views
0

アクティブなキャンペーンでテーブルを注文しようとしていますが、その後に "endDate"が続きます。つまり、新たに作成されたキャンペーンが常に先頭に表示され、その後に日付が表示されます。キャンペーンが終了すると、最新の「endDate」が一番上に表示されます。ここで"id"でMySQLを注文し、次に "date"で

は、以下の私のクエリです:

SELECT campaignId, 
     status, 
     dateCreated, 
     startDate, 
     endDate 
FROM  campaign 
WHERE deleted='False' 
ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, campaignId DESC 

下のスクリーンショットを見ると、いくつかは(赤いボックスで強調)「endDateに」 enter image description here

によって順序付けされていない最初の部分は、その正しいです"endDate"が終了せず、最初にidでソートされていることを意味します。しかし、最後の部分は間違っています、終了キャンペーンは "endDate"でソートする必要があります。私が間違っていた場所?

更新SQLフィドル(使用しているときWHERE deleted='False'を無視してください):これは動作するはずhttp://sqlfiddle.com/#!9/0a7afb

+0

http://sqlfiddle.comで、テーブル構造とサンプルデータと予想される結果とともに疑問を作成してください。 –

+0

作成されました...もう一度確認してください – nodeffect

答えて

0
SELECT 
    campaignId, status, dateCreated, startDate, endDate 
    FROM campaign 
    WHERE 
     deleted='False' 
    ORDER BY 
     DATE(endDate) DESC, campaignId DESC 

基本的には、>の順番で条件が必要ありません。

現在の日付よりも大きい日付のフィルタを使用する場合は、その条件に一致する必要があります。

+0

私はこれを試しましたが、それはまた動作しません – nodeffect

+0

sqlfiddleの例を与えることができますか? – Akshay

+0

上記を追加して見てください、削除してください= 'False' – nodeffect

1

ORDER BY DATE(endDate) > DATE(CURDATE()) DESCは、今後のキャンペーンが先に進むと言います。それはどのような順序で言うのではない。式をselect句に追加すると、次のように表示されます。

ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, endDate DESC, campaignId DESCを実行できますが、DATE(endDate) > DATE(CURDATE())という表現では並べ替えが非常に遅くなり、インデックスを使用できなくなります。さらに、日付の列にDATE()を入力する必要はありません。

将来のキャンペーンと過去のキャンペーンのリストを別々にする場合は、endDate条件をwhere句に入れて2回クエリを実行するとよいでしょう。ただし、小さなデータセットの場合は問題ありません。

+0

私は上記のクエリを試しました。それもちょうど終了日をソートします。 – nodeffect

0

"CASE"ステートメントを使用して問題を解決しました。誰かがこれを役に立つと思うような場合に備えて。

+0

この問題を解決済みとするには、最も好む回答の隣にあるチェックマークをクリックしてください。あなたが望むならあなた自身の答えにチェックを入れてもいいです。 – halfer

関連する問題