MySQL 하위 조회 에서 orderby 가 유효 하지 않 은 문제 해결 방법
문제 설명
상품 표 제품 만 들 기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/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.