2012-05-16 56 views
4

我需要MySQL日期時間字段的條件ORDER BY語句。我有,我想通過以下方式訂購職位表:所有以後的文章中應當責令ASC,並下令DESC所有歷史帖子。例如:有條件的ORDER BY ASC/DESC日期列

post_status  post_date  post_title 
===========  =========  ========== 
future   2012-10-01 Title 1 
future   2012-12-01 Title 2 
publish   2012-05-01 Title 3 
publish   2012-01-01 Title 4 

我需要類似下面的SQL東西...

SELECT post_status, post_date, post_title FROM wp_posts 
WHERE post_status IN ('future', 'publish') 
ORDER BY post_status ASC, 
CASE post_status 
    WHEN 'future' THEN 'post_date ASC' 
    ELSE 'post_date DESC' 
END; 

如何做到這一點的任何提示? 謝謝!

回答

13

試試這個:

ORDER BY post_status ASC, 
CASE post_status WHEN 'future' THEN POST_DATE END ASC, 
CASE WHEN post_status <> 'future' THEN post_date END DESC 
+0

這是一個更好的解決方案,因爲它僅需要表的單次掃描。 –

+0

太棒了!也似乎在伎倆!謝謝! – Mike

1

這樣的事情呢?選擇兩次併合並結果。

Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('future') 
ORDER BY post_status ASC ) alias1 
UNION 
Select * from (SELECT post_status, post_date, post_title 
FROM wp_posts WHERE post_status IN ('publish') 
ORDER BY post_status DESC) alias2 
+0

工作得很好,但比上述方案執行慢一點...... – Mike

1

嘗試這一個 -

SELECT 
    post_status, post_date, post_title 
FROM 
    wp_posts 
WHERE 
    post_status IN ('future', 'publish') 
ORDER BY 
    IF(post_status = 'future', 0, 1), 
    IF(post_status = 'future', TO_DAYS(post_date), TO_DAYS(post_date) * -1); 
+0

太棒了!這似乎工作,雖然我不真正按照我在做什麼.. – Mike

0

我會用一個union all,技巧在order by不能使用索引和較慢。

SELECT * FROM 
((SELECT 
    1 AS a, @rownum:[email protected]+1 B, post_status, post_date, post_title 
FROM 
    wp_posts, (SELECT @rownum:=0) r 
WHERE 
    post_status='publish' 
ORDER BY 
    post_date DESC) 
UNION ALL 
(SELECT 
    2 AS a, @rownum:[email protected]+1 B, post_status, post_date, post_title 
FROM 
    wp_posts, (SELECT @rownum:=0) r2 
WHERE 
    post_status='future' 
ORDER BY 
    post_date)) ORDER BY A,B; 
+0

好的,我得到了「#1248 - 每個派生表必須有自己的別名」.. – Mike