2010-07-04 4 views
8

단일 테이블에서 모든 행을 가져오고 싶지만 여러 가지 방법으로 순서를 지정하고 싶습니다. 예를 들어 내가 (FIELDB DESC)에 의해 두 번째 순서는 무시됩니다 excpet, SELECT UNION 및 ORDER BY를 mysql에서 사용하는 방법?

(SELECT * FROM table1 
ORDER BY fieldA ASC LIMIT 3 
) 
UNION 
(
SELECT * FROM table1 
ORDER BY FieldB DESC 
) 

그것은 작동

쓰기 ... 누가 왜 알아?

+2

보기 [UNION 구문 (http://dev.mysql.com/doc/refman/5.0/en/union.html) . '개별 SELECT 문에 대한 ORDER BY 사용은'순서에 대해 아무런 의미가 없음 '을 찾으십시오. 또한 [이 SO 게시물] (http://stackoverflow.com/questions/3163503/sorting-union-queries-in-mysql/3163526#3163526)을 참조하십시오. – Mike

+0

와우, 효과가 있었지만 어떻게 작동할까요? 음 .. 조금 혼란 스럽네 ..! – stighy

답변

17

UNION 연산자는 암시 적 정렬 (IIRC, 키 열)을 수행하기 위해 암시 적 정렬을 수행합니다.

결과에서 다른 정렬을 원할 경우 ORDER BY을 결합 선택 영역에 적용해야합니다.

첫 번째 선택 사항과 두 번째 선택 사항을 구별 할 수있는 방법이 필요하므로 합법적으로 주문할 수 있습니다. (테스트되지 않은) 식으로 뭔가 :이 방법

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3) 
UNION 
(SELECT table1.*, 1 AS TMP_ORDER FROM table1) 
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC 

문제는 당신이 UNION에서 첫 번째 쿼리 (열이 완전히 일치하지 않기 때문에)의 한 부분으로 선택한 세 개의 행에 대한 중복을해야한다는 것입니다.

대신 SELECT 개의 문장을 사용할 수 있습니까? 사용자는 고정 된 결과로서 상기 제 SELECT를 선언 할 수

+0

@Mike, 그 질문은 노동 조합을 기반으로하는 별개의 정렬을 필요로하지 않습니다. 그것은 'CASE' 문이 들어오는 곳입니다. –

+0

외부'select *'는 필요하지 않습니다. 내부 쿼리 'order by'는 제한이 없으므로 두 번째 쿼리에서 아무 것도하지 않습니다.'(select t1. *, 0 tmp_order from fieldA asc limit 3) union (t2. *, 1을 t2에서 선택) tmp_order, case ... '에 의한 순서. – Donnie

+0

+1 @Mike - 그 답은 데이터가 나온 하위 쿼리에 의해서만 정렬됩니다. FieldA와 FieldB가 각 쿼리에서 정렬되도록 두 번째 수준의 정렬이 없습니다. 대답은 두 번째 수준의 정렬을 포함합니다. – mdma

1

..

SELECT 'First select option' AS something 

UNION 

SELECT something 
FROM(
    (SELECT something 
    FROM SomeTable 
    ORDER BY something ASC)) FixedResult 
관련 문제