2012-09-04 5 views
4

일부 이벤트에 대한 정보를 저장하는 테이블이 있습니다.
나는 그 사건들을 나열하고 싶다. 그러나 나는 다가오는 사건들을 우선적으로 오름차순으로 표시하고, 과거 사건들은 내림차순으로 아래에 표시하고 싶다.MySQL : UNION 내에서 선택 순서 유지

아마 같은 것을 할 싶습니다 :

(SELECT * FROM events WHERE date > NOW() ORDER BY date ASC) 
UNION 
(SELECT * FROM events WHERE date < NOW() ORDER BY date DESC) 

나는 MySQL의 문서를 확인하고 UNION은 일반적으로 그렇게 SELECT들 각각은 매우 쓸모가 withing에 주문 행의 정렬되지 않은 세트로 작동하는 것을 발견했다. UNION ALL도 그 일을하지 않습니다.

약간의 인터넷 검색을 한 후 SELECT를 사용하여 행을 정렬하는 방법을 알고 있지만 다른 순서로 같은 열을 순서에 지정하는 방법을 여전히 알지 못합니다.

나는 두 개의 SELECT를 실행할 수 있다고 생각한다. 하나는 다가오는 이벤트를, 하나는 과거 이벤트를위한 것이다. 그러나 나는 단지 하나의 쿼리로 그것을 수행 할 수있는 가능성이 있는지 궁금합니다.
제안 할만한 자료가 있습니까?

답변

3

나는 이것을 위해 UNION이 필요하지 않다고 생각합니다. 당신은 쓸 수 있어야 :

SELECT * 
    FROM events 
ORDER 
    BY CASE WHEN date < NOW() THEN date ELSE NOW() END DESC, 
     date ASC 
; 

ORDER BYCASE WHEN date < NOW() THEN date ELSE NOW() END DESC 부분은 예정된 이벤트가 먼저 올 것을 보장하고, 과거의 사건이 원하는 순서에 표시되도록하지만, 곧 사건의 상대적인 순서에 영향을주지 않습니다 . date ASC 부분은 해당 부분을 처리하는 대체 기준입니다.

(면책 조항 :. 테스트하지)

+0

환상적으로, 내가 원한 정확하게하는 것 같습니다! 이해하는 데는 조금 시간이 걸렸지 만 지금은 논리를 보았습니다. 고맙습니다! – Karryanna

+0

@ 카리 야나 : 천만에요! – ruakh

0

가 더 일반적인 질문에 대답하기는 UNION 작업은 어떤 검색된 행의 순서를 유지하기 위해 보장 할 수 없습니다. 특정 순서로 반환 된 행을 얻으려면 쿼리 (가장 바깥 쪽 SELECT 문)에 ORDER BY 절을 사용해야합니다.