DBMS/MySQL

[MySQL] 서브쿼리에서 ORDER BY 절이 무시될 때 해결하는 방법

Doshisha 2022. 10. 5. 14:26

개요

이번 글에서는 MySQL에서 서브쿼리의 ORDER BY 절이 무시될 때 해결하는 방법에 대해 이야기해 보려고 한다.

문제 상황

SELECT
	FORMAT(@ROWNUM := @ROWNUM+1, 0) AS rowNum,
	A.*            
FROM
	(SELECT
		menuName,
		menuPrice,
		regDate
	FROM
		baemin_db.bm_basket
	WHERE
		userIdn = 1
	AND
		storeIdn = 1
	ORDER BY
		regDate DESC
	) AS A,
	(SELECT
		@ROWNUM := 0
	) AS B

위 쿼리는 서브쿼리에서 장바구니 테이블의 메뉴, 가격, 등록일을 등록일의 역순으로 조회하고 ROWNUM으로 번호를 매기는 쿼리인데 실행결과를 보면

실행 결과

서브쿼리의 결과들이 ORDER BY 절의 영향을 받지 않고 있는 것을 확인할 수 있다.

이와 같은 문제가 발생하는 이유는 MySQL은 서브쿼리의 결과 순서를 따로 메모리에 적재해 놓지 않기 때문에 서브쿼리의 ORDER BY 절이 메인쿼리에서는 경우에 따라 무시될 수 있다.

해결하기

SELECT
	FORMAT(@ROWNUM := @ROWNUM+1, 0) AS rowNum,
	A.*            
FROM
	(SELECT
		menuName,
		menuPrice,
		regDate
	FROM
		baemin_db.bm_basket
	WHERE
		userIdn = 1
	AND
		storeIdn = 1
	ORDER BY
		regDate DESC
	LIMIT
		18446744073709551615
	) AS A,
	(SELECT
		@ROWNUM := 0
	) AS B

 

위와 같은 상황이 발생할 때는 서브쿼리의 LIMIT을 사용하여 문제를 해결할 수 있다.

실행결과를 보면

실행 결과

서브쿼리의 ORDER BY 절이 무시되지 않고 등록일의 역순으로 잘 출력되는 것을 확인할 수 있다.

참고로 MSSQL에서 똑같은 상황이 발생한다면 TOP을 이용하여 이와 같은 문제를 해결할 수 있다.