MySQL - UNION 사용 시 limit, order by 사용하기

반응형

 

개요

다음과 같은 테이블이 있다.

select * from test;

 

이 테이블을 간단히 union해보자.

한 개의 테이블로 간단 예시를 보여주기 위해 union이 아닌 union all 을 사용하였다.

select * from test
union all
select * from test;


문제1. order by 와 limit를 사용하여 union 결과셋 출력

한 개의 테이블에 order by 와 limit 키워드를 사용한 결과셋을 union으로 합쳐보자.

  • 테이블1 : id 내림차순, 결과셋은 1행만 출력
  • 테이블2 : 모든 행 출력
  • 테이블1과 2를 하나로 합치기

 

-- 오류 출력
select * from test order by id desc limit 1
union all
select * from test;

위와 같이 쿼리를 짜면 오류가 출력된다.

Error Code: 1064.
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'union all select * from test' at line 2

 

union 쿼리에서 각각의 결과셋은 order by 와 limit 키워드를 사용할 수 없기 때문이다.

그럼 어떻게 해야할까? 생각보다 답은 정말 간단하다.

서브 쿼리를 이용하여 결과셋을 출력하고, 출력된 결과셋을 union으로 합쳐주면 된다.

-- order by, limit가 있는 쿼리는 서브 쿼리로 처리
(select * from test order by id desc limit 1)
union all
select * from test;

문제2. union 결과셋을 order by 로 정렬하기

조건을 더 걸어보자.

각각의 테이블에서 서로 다른 행을 조회하고 union 한다.

그리고 그 행을 정렬을 해보자.

  • 테이블1 : id가 1인 행만 출력
  • 테이블2 : id가 2인 행만 출력
  • 테이블1과 2를 union 으로 합치기
  • 합쳐진 결과를 내림차순으로 보여주기

서브 쿼리를 통해 나온 결과셋은 이미 각각의 쿼리가 수행된 결과셋이 오기 때문에

union으로 합쳐진 하나의 테이블을 다시 정렬하려면 from 절에 서브쿼리로 union 결과셋을 넣어주면 된다.

select * from
	(
		select * from test where id = 1
		union all
		select * from test where id = 2
	) as result
order by id desc;

 

반응형