2012-05-16 2 views
4

날짜/시간 필드에 MySQL 조건부 ORDER BY 문이 필요합니다. 모든 미래의 게시물ASCDESC를 주문한 모든 역사적 게시물를 주문한다 : 나는 다음과 같은 방법으로 주문하고 싶은 게시물이있는 테이블이있다. 예 : MySQL 조건부 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

내가 인덱스를 사용할 수 없습니다 order byunion all, 트릭을 사용하고 느립니다.

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