MySQL 하위 조회 에서 orderby 가 유효 하지 않 은 문제 해결 방법

우연 한 기회 에 하나의 SQL 문 구 는 서로 다른 MySQL 인 스 턴 스 에서 서로 다른 결 과 를 얻 었 음 을 발견 했다.
문제 설명
상품 표 제품 만 들 기tbl 및 상품 조작 기록 표 produtoperation_tbl 두 표 로 업무 장면 을 모 의 하고 구조 와 데 이 터 는 다음 과 같다.


다음은 모든 상품 의 최신 수정 시간 을 조회 하고 다음 과 같은 문 구 를 사용 해 야 합 니 다.

select t1.id, t1.name, t2.product_id, t2.created_at  from product_tbl t1 left join (select * from product_operation_log_tbl order by created_at desc) t2 on t1.id = t2.product_id group by t1.id;
결 과 를 통 해 알 수 있 듯 이 하위 검색 은 먼저 produtoperation_log_tbl 의 모든 기록 은 생 성 시간(createdat)역순,그리고 produttbl 에서 join 작업 을 하여 상품 의 최신 수정 시간 을 조회 합 니 다.

지역 A 의 MySQL 실례 에서 상품 의 최신 수정 시간 을 조회 하면 정확 한 결 과 를 얻 을 수 있 지만 지역 B 의 MySQL 실례 에서 얻 은 수정 시간 은 최신 이 아니 라 가장 오래된 것 이다.문 구 를 간소화 한 결과 하위 조회 의 order by created 임 을 발견 하 였 습 니 다.at desc 문 구 는 지역 B 의 인 스 턴 스 에서 유효 하지 않 습 니 다.
조사 과정
혹시 지역 이 MySQL 의 행동 에 영향 을 줄 수 있 습 니까?DBA 검 사 를 통 해 지역 A 의 MySQL 은 5.6 버 전 이 고 지역 B 의 MySQL 은 5.7 버 전 이 며 이 글 을 찾 았 습 니 다.
https://blog.csdn.net/weixin_42121058/article/details/113588551
글 의 설명 에 따 르 면 MySQL 5.7 버 전 은 하위 조회 중의 orderby 문 구 를 무시 합 니 다.그런데 궁금 한 것 은 우리 가 업무 장면 을 모 의 한 MySQL 은 8.0 버 전 으로 이 문제 가 발생 하지 않 았 습 니 다.docker 를 사용 하여 각각 MySQL 5.6,5.7,8.0 세 개의 인 스 턴 스 를 시작 하여 위의 작업 을 반복 합 니 다.결 과 는 다음 과 같 습 니 다.

MySQL 5.7 버 전 만 하위 조회 의 orderby 를 무시 한 것 을 볼 수 있 습 니 다.5.7 에 bug 가 도입 되 었 을 가능성 이 있 습 니까?후속 버 전 은 다시 복원 되 었 습 니까?
문제 의 원인
문서 와 자 료 를 계속 검색 한 결과 공식 포럼 에 다음 과 같은 설명 이 있 습 니 다.
A "table" (and subquery in the FROM clause too) is - according to the SQL standard - an unordered set of rows. Rows in a table (or in a subquery in the FROM clause) do not come in any specific order. That's why the optimizer can ignore the ORDER BY clause that you have specified. In fact, SQL standard does not even allow the ORDER BY clause to appear in this subquery (we allow it, because ORDER BY ... LIMIT ... changes the result, the set of rows, not only their order). You need to treat the subquery in the FROM clause, as a set of rows in some unspecified and undefined order, and put the ORDER BY on the top-level SELECT.
문제 의 원인 이 명확 해 졌 습 니 다.원래 SQL 표준 에서 table 의 정 의 는 정렬 되 지 않 은 데이터 집합 이 고 SQL 하위 조 회 는 임시 table 입 니 다.이 정의 에 따라 하위 조회 중의 orderby 는 무 시 됩 니 다.이 동시에 공식 답장 도 해결 방안 을 제시 했다.하위 조회 의 order by 를 가장 바깥쪽 selection 구문 으로 이동 시 켰 다.
총결산
SQL 표준 에서 하위 조회 의 orderby 는 유효 하지 않 습 니 다.
MySQL 5.7 은 이 점 에서 SQL 기준 을 따 르 기 때문에 문제 가 노출 되 었 고 MySQL 5.6/8.0 에 서 는 이러한 표기 법 이 여전히 유효 하 다.
MySQL 서브 쿼 리 에서 orderby 가 유효 하지 않 은 문제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 MySQL 서브 쿼 리 orderby 가 유효 하지 않 은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
참고 문서
https://stackoverflow.com/questions/26372511/mysql-mariadb-order-by-inside-subquery
https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/

좋은 웹페이지 즐겨찾기