programing

"SELECT UNION SELECT" 쿼리를 정렬 기준으로 독립 오더로 지정하시겠습니까?

luckcodes 2022. 10. 29. 14:53

"SELECT UNION SELECT" 쿼리를 정렬 기준으로 독립 오더로 지정하시겠습니까?

백엔드에서 결과를 쉽게 진행하기 위해 병합할 쿼리가 두 개 있습니다.

기본 구조는 다음과 같습니다.

(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC)
UNION ALL
(SELECT * FROM table ORDER BY table.timestamp DESC)

있다WHERE이러한 쿼리가 완전히 다른 결과를 반환하지만 동일한 형식으로 반환되는 절은 생략합니다.문제는 아무것도 추가하지 않았다는 것입니다.ORDER BY정렬이 변경되어 올바르게 정렬되지 않습니다.사실 두 그룹 모두 거꾸로 분류하는 것처럼 보인다.그러나 관련 없는 숫자 필드를 기준으로 정렬하려고 해도 순서가 변경되지 않습니다.

아마도요.UNION이게 내가 원하는 게 아니니?두 개의 SQL 결과를 하나로 묶는 '덤버' 방법이 있습니까?

전체 병합 결과 집합의 정렬이 동일하지 않아야 합니다.특별/중요한 아이템을 맨 위에 리스트 하고, 그 외의 아이템은 아래 일정 기간 내에 날짜/시간별로 정렬하여 리스트 하려고 합니다.

못생긴 거 알지만 해봐

select a.* from (
(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC)
) a
UNION ALL
select b.* from (
(SELECT * FROM table ORDER BY table.timestamp DESC)
) b

주의: Union과 중복된 결과를 얻을 수 있다는 것을 알고 있을 것입니다.

이유: 하위 쿼리는 정의상 순서 없는 행 집합을 반환합니다.옵티마이저는 최근에야 이 기준서의 이 조항을 활용하기 시작했다.그렇게 함으로써, 그것은 토스를 한다.ORDER BY(가 없는 한)LIMIT; 플랜 A 참조).당신이 본 순서는 단지 우연의 일치일 뿐이었다.WHERE결과를 올바르게 정렬하려면 나중에 몇 가지 주문을 적용해야 합니다(플랜 B 참조).

또 다른 최근 최적화...이전 이야기UNION 는 항상 각 서브쿼리의 결과를 임시 테이블로 보냅니다.자, 이제,UNION ALL(및 기타 몇 가지 제한사항), 클라이언트에 직접 결과를 제공할 수 있습니다.(단, 제가 제안하는 플랜 B와 C는 아직 Temp가 필요합니다.ORDER BY.)

플랜 A는 다음과 같이 동작할 수 있는 크러지입니다.

(SELECT * FROM table ORDER BY table.field DESC, table.timestamp DESC
                     LIMIT 9999999)
UNION ALL
(SELECT * FROM table ORDER BY table.timestamp DESC
                     LIMIT 9999999)

플랜 B는 동작할 가능성이 있습니다.ORDER BY데이터에 적합할 수 있습니다.

(SELECT * FROM table)
UNION ALL
(SELECT * FROM table)
ORDER BY table.field DESC, table.timestamp DESC

플랜 C는 플랜 B에서 일반화하려는 시도입니다.

(SELECT *, 1 AS seq1, table.field AS seq2 FROM table)
UNION ALL
(SELECT *, 2 AS seq1, 0 AS seq2 FROM table)
ORDER BY seq1,           -- to get the first SELECT first
         seq2 DESC,      -- unclear what your intent was with table.field
         timestamp DESC

요점주문을 받으려면 명시적으로 다음을 수행해야 합니다.ORDER BY(현재는,UNION작품들이 순차적으로 완성됩니다.어느 날,UNIONs병렬로 실행할 수 있습니다.)

내가 제대로 이해했다면 당신은 그것을 만들어 볼 수 있다.grp두 결과를 나타내는 하위 쿼리의 열order bydisclossible을 클릭합니다.

SELECT t1.*
FROM (
    SELECT *,1 grp 
    FROM table 
    ORDER BY 
    UNION ALL
    SELECT *,2 
    FROM table 
) t1
ORDER BY t1.grp,t1.field DESC, t1.timestamp DESC

내부 주문 cluser는 출력 결과에 영향을 주지 않습니다.Order Out Of Union을 사용해야 합니다.

SELECT * From (
SELECT * FROM table
UNION ALL
SELECT * FROM table
) as T Order by T.field  DESC ,table.timestamp DESC

를함 include include include whereorder by 다음과 같이 합니다.

select t.*
from t
where (<1>) or (<2>)
order by (<1>) desc,  -- put the "1" rows first
         (case when <1> then t.field desc end),
         t.timestamp asc;

언급URL : https://stackoverflow.com/questions/53912254/select-union-select-query-with-independent-order-by-sorting