2016-05-22 1 views
0

ウェブサイトでは、MySQLで整列するのに苦労している項目のリストがあります。MySQL:ORDER BY式ですか?

いくつかのアイテムは "期限切れ"(そのend_atは過去)ですが、それらを取得したいのですが、 "アクティブ"アイテムの後ろにあります(end_atはNULLか将来のいずれかです)。私はさらにさんは、「ビュー」を言わせて、別のフィールドに応じてアイテムを並べ替えることができるようにしたいと思い

(最初に最も人気のあるものを得るために)

基本的に、これは私が取得したいものです。

  • 項目1(アクティブ - 最も人気のある)
  • アイテム2(アクティブ - 番目に人気)
  • アイテム3(アクティブ - 番目に人気)
  • アイテム4(期限切れ)
  • 項目5(期限切れ)

はこれまでのところ、これは私が試したものである(など):

SELECT name, end_at 
FROM items 
ORDER BY (end_at IS NULL OR end_at > CURDATE()), views DESC; 

は動作しません。でも、最初に返されたアイテムは有効期限が切れています。

答えて

1

あなたはほとんどそれを持っています。 MySQLの条件は0または1です。 01の前に来るので、そして、あなたはどちらかの並べ替えdesc

SELECT name,end_at FROM items 
ORDER BY (end_at IS NULL OR end_at > CURDATE()) DESC, 
     views DESC; 

かは、望ましい結果

SELECT name,end_at FROM items 
ORDER BY end_at IS NOT NULL AND end_at < CURDATE() ASC, 
     views DESC; 
に取得するための条件を否定しなければなりません
0

私はちょうど方法を発見した:

SELECT * 
FROM items 
ORDER BY CASE 
WHEN (end_at IS NULL OR end_at > CURDATE()) 
    THEN 0 
    ELSE 1 
END, views DESC; 

式によれば、各行の値に影響CASE。ソートは、この計算値を使用して通常どおりに行われます。

関連する問題