2013-04-26 2 views
1

현재 공연을위한 아젠다가 포함 된 아티스트 웹 사이트에서 작업하고 있습니다. 나는 처음에 공연을 시작 (오름차순)에 나열하고, 앞으로의 공연을 목록으로 만들고 싶다. 현재 솔루션은 두 가지 다른 쿼리입니다. 한 번의 쿼리는 과거의 이벤트와 하나의 이벤트를 호출하지만, 병합하는 방법을 찾는 것은 깔끔합니다. 이것이 가능한지 아무도 모르고, 어떻게?ASC에 의한 SQL 질의 주문 날짜, 끝의 과거 항목?

이렇게 시작합니다.

SELECT * 
FROM agenda 
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id 

답변

5
SELECT * 
FROM agenda 
INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id 
ORDER BY 
CASE WHEN yourDateColumn > NOW() THEN 1 
    WHEN yourDateColumn < NOW() THEN 2 
END ASC, 
yourDateColumn 
+2

또한 'yourDateColumn'을'ORDER BY' 절에 추가해야합니다. 그렇지 않으면 순서가 매겨지지 않은 일련의 과거 이벤트로 순서가 매겨지지 않을 수 있습니다. – Jesse

+0

좋은 지적, 고마워. – fancyPants

+0

답변이 늦어서 죄송합니다. 건강 상 문제가 있습니다. 다시 비즈니스. 나를 올바른 방향으로 향하게 해주셔서 감사합니다 !! – Jason

0

당신이 UNION를 사용하는 경우, 당신은 깔끔하게 두 문장을 수행 할 수 있습니다 - 각 ORDER BY 날짜 필드에 단순히 있기 때문에, 당신은 빠른 쿼리를 유지하기 위해 index을 사용합니다 알고

SELECT * 
    FROM agenda 
    INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id 
    WHERE yourDateColumn > NOW() 
    ORDER BY yourDateColumn ASC 
UNION ALL 
    SELECT * 
    FROM agenda 
    INNER JOIN organizer ON agenda.agenda_organizer=organizer.organizer_id 
    WHERE yourDateColumn < NOW() 
    ORDER BY yourDateColumn DESC 
0

이 작업을 시도 할 수 있습니다 :

SELECT * 
FROM 
(SELECT * FROM agenda WHERE yourDateColumn > NOW() ORDER BY yourDateColumn ASC) future 

UNION ALL 

SELECT * 
FROM 
(SELECT * FROM agenda WHERE yourDateColumn < NOW() ORDER BY yourDateColumn DESC) past 

이해야 먼저 다가오는 이벤트 ASC 및 두 방향으로 동일한 열을 주문 후 지난 이벤트 DESC

0

을 선택하면 트릭 가능합니다 :

SELECT yourDateColumn,IF(yourDateColumn)<NOW(),DATEDIFF(yourDateColumn),NOW()) * -1000000000,UNIX_TIMESTAMP(STR_TO_DATE(CONVERT_TZ(e.startDate,e.timeZone,'Europe/Paris'), '%Y-%m-%d'))) AS diff FROM yourTable ORDER BY DIFF ASC; 
날짜가 결국에 의해 정렬되도록 키가 여기에 충분히 큰 음수를 곱된다

ASC 이후 과거의 ASC.