2012-12-03 20 views
0

我有一個WordPress自定義發佈類型的數據庫,這個自定義發佈類型叫做事件自定義字段,用於事件的startdates和enddates。我想在列表中輸出所有這些事件,這些事件以升序列出的即將發生的事件首先按升序排列,其餘事件按降序排列。如何使用date> NOW()ASC和其餘的DESC命令SQL結果?

我試圖將代碼從這個答案複製,但我似乎無法得到它的權利 - 所有職位排序遞增:MySQL conditional ORDER BY ASC/DESC for date column

這是現在我的代碼:

SELECT p.post_title, m.meta_value 
FROM wp_posts as p, wp_postmeta as m 
WHERE p.ID = m.post_id 
    AND p.post_type = "events" 
    AND m.meta_key = "startdate" 
    AND p.post_status = "publish" 
ORDER BY m.meta_value ASC, 
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value END ASC, 
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC 
LIMIT 10 

回答

1

認爲這將做到這一點。該邏輯是合​​理的,但我沒那麼熟悉MySQL的,所以你可能需要做一個或兩個轉換在第二種情況:

ORDER BY CASE WHEN m.meta_value > DATE(NOW()) THEN 0 ELSE 1 END, 
     CASE WEHN m.meta_value > DATE(NOW()) THEN m.meta_value ELSE m.meta_value * -1 END 

的技巧是,你要正確對待日期爲數字,和MySQL可能會要求你做這個有點不同。它的工作原理是,在第二級別中,排序僅適用於第一級別的值相等時:因此所有即將發生的事件都將排序到頂部,並且在即將到來的事件中按升序排序。所有過去的事件將顯示在下一個,並在該列表中,他們將降序排序,因爲我們倒置了日期值。

+0

幾乎得到了這個工作!即將發生的事件以正確的順序顯示,但之前的事件按順序排列。任何想法爲什麼? –

+0

m.meta_value * -1沒有做它應該做的。也許可以使用1-m.meta_value,或者查看某種類型的轉換/轉換。 –

+0

想想我已經在這裏嘗試了一切(猜猜你做的有點像:CAST(m.meta_value AS DATE)等),但我不習慣在SQL中使用條件語句,所以我幾乎不知道我是什麼這樣做。有沒有可能以另一種方式做到這一點,比如使用連接以某種方式? –

1

刪除order by中的第一個子句。它應該是:

ORDER BY 
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value END ASC, 
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC 

實際上,我不確定postgres中NULL的排序順序是什麼。你可以得到你想要的東西做:

ORDER BY 
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value 
         else cast('9999-01-01' as date) END ASC, 
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC 
+0

這是行不通的?我認爲CASE需要求值爲NULL,如果一個值不符合任何條件,並且爲了比較,mysql會將NULL視爲0 ...在日期的情況下意味着過去的事件被排序到頂端,因爲在當前日期之前有數字嗎? –

+0

我沒有得到任何這些工作,我只有事件的升序列表 - 與運行'按字段順序的表格順序選擇*'相同。不管怎麼說,還是要謝謝你! –