2010-11-24 4 views
8

첫 번째 문의를 주문하고 첫 번째로 반환 된 행을 유지하고 두 번째 조회를 주문할 수 있습니까? (즉 만드는 경우 sence) 현재의 내 질문의MYSQL UNION ORDERING

예는 다음과 같습니다 나는 카테고리 사과 아래에있는 장치가이 목록 순서로 구성된다과의 정상에있을 것이라고 기대했다

SELECT 
    * 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
ORDER BY 
    ListOrder 
UNION 
SELECT 
     * 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 

다른 장치 위에 나열하십시오. 그러나 이것은 두 개의 querys를 함께 엉망으로 만드는 것처럼 보입니다.

답변

15

인공 정렬 키를 도입해야합니다. 뭔가 같은 :

SELECT 
    *, 1 as SortKey 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
UNION 
SELECT 
     *, 2 as SortKey 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 
ORDER BY SortKey, ListOrder 
+0

이것이 내가 과거에 성취 한 방법이다. – Sonny

+0

치료와 같이 일했다. Thanks Joe! – Yardstermister

+0

안녕, 난 인공 정렬 키를 만들 필요가 없었어요, 난 그냥 각각의 테이블은 내가 정렬하고자하는 열의 동일한 이름을 가지고 있는지 확인했다. 필자의 경우, 열 이름은 "주문"이었다. 그래서 내가 했어 : 선택 *, 테이블 1 UNION select *에서 주문 uOrder로 주문 테이블 2에서 주문 uOrder 주문 –

2

당신 수 가짜는

SELECT col1, col2 ... 
FROM (
    SELECT 1 fake_order, col1, col2 ... FROM Devices WHERE Live ='true' AND Category='apple' ORDER BY ListOrder 
    UNION ALL 
    SELECT 2, col1, col2 ... FROM Devices WHERE DeviceLive ='true' 
) AS T 
ORDER BY fake_order 

(내 머리 위로 떨어져 테스트되지 않은 SQL)

+0

나는 이것이 오래되었다는 것을 알지만, 완전해야한다. 이것이 작동하려면 내부 쿼리를 명명해야합니다. –

+0

@TomHeard - 감사합니다. 쿼리를 업데이트했습니다. – Tony

+0

'그대로'삭제하면 잘됩니다. –

2

UNION이 암시 중복 기능을 가지고 있습니다. 이것은 그것을 사용하는 부작용이 일어날 수 있도록 그것의 정렬로 모든 것이 뒤죽박죽이된다는 것을 의미합니다. 또한 (보통은 아니지만) 정렬 된 출력을 얻는다는 것을 의미합니다 (다음 단락 참조).

UNION ALL은 이것을 제거하지만 명시적인 order by이없는 쿼리의 출력에는 보장 된 정렬이 없습니다. 이것은 또 다른 해답으로 다루어졌지만 중요한 이유를 지적하는 것이 가치 있다고 생각했습니다.

+0

감사합니다. 내 계획이 일종의 정렬을 수행하는 이유를 찾고있었습니다. 이것은 그것과 내 이상한 주문 문제에 대답합니다. –

0

내가 조 스테파넬 리에서 내 대답을 얻었다, 그러나 조금 수정 :

안녕하세요, 난 인공 정렬 키를 만들 필요가 없었다을, 난 그냥 각 테이블 모두의 같은 이름을 한 것으로 확인했다 column 나는 정렬하고 싶었다. 필자의 경우, 열 이름은 "주문"이었다. 그렇게 했어 :

Select *, order as uOrder from table 1 
UNION 
select *, order as uOrder from table 2 
ORDER BY uOrder