2012-12-15 3 views
2

다음 코드는 만료되지 않은 행이 맨 위에있는 목록을 생성 한 다음 유효 기간이 만료되고 끝에 만료 된 목록을 생성합니다 (모두 오름차순). 문제는 이미 만료 된 행의 마지막 블록을 내림차순으로 표시하여 다른 상위 블록의 순서를 변경하지 않고 해당 블록의 맨 위에 만료 된 행을 표시하도록하는 것입니다.SQL - 같은 필드의 다른 "ORDER BY"값

기본적으로, 나는 ... 같은 레코드 내에 조항이 "BY ORDER"를 통합 할 수있는 방법을 찾기 위해

어떤 아이디어를 시도하고있다? 다음 UNION ALL 다른 SELECT 절에 만료 된 감사

SELECT * 
    FROM prueba 
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s) 
ORDER BY (CASE 
      WHEN prueba.Expiry = 'UNKNOWN' THEN 1 
      WHEN prueba.Expiry < CURRENT_DATE THEN 2 
      END) 
     , prueba.Expiry ASC 
+0

어떤 데이터 유형입니다 시도? 형식은 무엇입니까? – ccleve

+1

그래서 문제가 무엇입니까? 쿼리가 작동하지 않는 이유는 무엇입니까? –

+0

날짜입니다. 형식은 년 - 월 - 일입니다 (예 : 2012-12-14) – GreenSpectre

답변

1

이 만료이

DEMO FIDDLE

SELECT * FROM t 
order by case 
     when expiry = 'Unknown' Then 1 
     WHEN expiry >= CURRENT_DATE THEN 0 
     ELSE 2 END, 
CASE WHEN expiry >= CURRENT_DATE THEN expiry END, 
CASE WHEN expiry < CURRENT_DATE THEN expiry END desc 
+0

완벽하게 작동했습니다! 정확히 내가 필요했던 것입니다. 정말 고마워요. – GreenSpectre

0

별도의 레코드 :

(SELECT * 
FROM prueba 
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s) 
AND prueba.Expiry > CURRENT_DATE 
ORDER BY prueba.Expiry DESC) 
UNION ALL 
(SELECT * 
FROM prueba 
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s) 
AND prueba.Expiry = 'UNKNOWN') 
UNION ALL 
(SELECT * 
FROM prueba 
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s) 
AND prueba.Expiry < CURRENT_DATE 
ORDER BY prueba.Expiry DESC) 
+0

각'SELECT '에서'ORDER BY' 절을 필요에 맞게 'ASC'또는 'DESC'로 변경할 수 있습니다. –

+0

감사합니다. 나는 그것을 넣었으나이 결과를 얻고있다. SQL 구문에 오류가있다. 'SELECT * FROM prueba WHERE UPPER (CONCAT (회사, 거래, 키워드, 유형, 만기, 이름)'행의 6 행 근처에서 사용할 올바른 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. – GreenSpectre

+0

잘 모름 이것이 원인이라면'UNION ALL'을 버렸습니다. 가장 최근 편집으로 다시 시도 하시겠습니까? –

관련 문제