"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 by
disclossible을 클릭합니다.
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 where
의 order 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
'programing' 카테고리의 다른 글
Python에 사용할 IDE는 무엇입니까? (0) | 2022.10.29 |
---|---|
Jersey 2.0에서의 의존성 주입 (0) | 2022.10.29 |
shell 명령을 사용하여 mysql 데이터베이스를 삭제하는 방법 (0) | 2022.10.28 |
Java: Thread.current스레드().sleep(x)와실.sleep(x) (0) | 2022.10.28 |
Javascript 배열에 지정된 값과 동일한 속성을 가진 개체가 포함되어 있는지 확인하는 방법은 무엇입니까? (0) | 2022.10.28 |