개요
이번 글에서는 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을 이용하여 이와 같은 문제를 해결할 수 있다.
'DBMS > MySQL' 카테고리의 다른 글
[MySQL] MySQL Safe mode 해제하기 (0) | 2023.01.04 |
---|---|
[MySQL] 계층형 재귀 쿼리를 사용해서 성능개선 및 확장성 있는 구조로 프로젝트 리팩토링하기 (0) | 2022.11.14 |