[MySQL] UNION 사용 시 테이블별로 정렬하기

김도형·2023년 1월 15일
0

요점

  • mysql은 서브쿼리내에서의 정렬을 적용되지 않음.
  • 그래서 테이블별로 정렬하기(ORDER BY) 어려움(안되는 것은 아님)

테이블별로 정렬하게 된 계기

응답시간 빠른순 정렬을 해야하는 데, DB 상에서는 이렇게 표현되어 있다.

00000 은 응답이 없는 것이므로 로직상에서는 빠른순에 해당되지 않고 제일 아래로 가야한다. 그리고 00628 -> 06분 28초가 제일 상위로 올라와야 한다.

즉 기대 결과는 아래와 같이 나와야 한다. (응답없음 00000)

그러면 아래 조건문을 사용해서 union all 로 합치면 된다.

  • 00000 포함하지 않은 select 문
  • 00000 포함된 select 문
(SELECT cq.* FROM db_platform.COACH_CHAT_RESPONSE cq
 WHERE cq.avg_resp_time != "00000"
 ORDER BY cq.avg_resp_time*1 ASC)
 UNION ALL
 (SELECT a.* FROM db_platform.COACH_CHAT_RESPONSE a
 WHERE a.avg_resp_time = "00000")
 limit 1, 10

그러나 결과는 pk로 순서가 정렬된다.

해결 방안

형식은 이렇다.

SELECT t1.* FROM 
(
    SELECT ... FROM
    (
        SELECT ... FROM ...     
    )
    AS t11
    GROUP BY ...
    ORDER BY ...
) AS t1
UNION
SELECT t2.* FROM 
(
    SELECT ... FROM 
    (
        SELECT ... FROM ...     
    )
    AS t22
    GROUP BY ...
    ORDER BY ...
) AS t2

좀 많이 길다... 이거를 진행하고 있는 프로젝트에 적용하면

SELECT t1.* FROM      
(SELECT * FROM(SELECT * FROM RESPONSE WHERE resp_time != "00000")   
	AS t11 
	GROUP BY t11.pk_index
	ORDER BY t11.resp_time*1 ASC 
) AS t1 
UNION ALL 
SELECT t2.* FROM      
(SELECT * FROM(SELECT * FROM RESPONSE WHERE resp_time = "00000") 
	AS t22 
	GROUP BY t22.pk_index 
) AS t2 LIMIT 0, 10

참고 링크 : https://m.blog.naver.com/rorean/221538483386

끝맺음

테이블 생성할 때, 위와 같은 경우도 생각해서 응답이 없는 경우에 대한 컬럼을 하나 생성하는 것이 좋을 거 같다.
테이블별로 쿼리문을 작성하면 다른 사람이 유지보수할 때나 성능면에서도 불리할 거 같다.

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글