programing

MySQL Union 정렬이 다른 서버에서 예기치 않게 작동합니다.

coolbiz 2022. 9. 28. 23:05
반응형

MySQL Union 정렬이 다른 서버에서 예기치 않게 작동합니다.

좋은 하루 되세요.

"오류" 쿼리에 문제가 있습니다.다른 서버에서 실행할 때 필요한 다른 결과 세트를 얻을 수 있습니다.

export-> import를 통해 모든 "테이블"을 다시 Import하려고 했는데 아직 동작하지 않습니다.

어디가 문제입니까?MariaDB에서 문제가 발생할 수 있습니까?

데이터베이스 버전:

  • 5.6.27 - MySQL Community Server (GPL), 클라이언트: libmysql 5.0.11-dev
  • 10.0.25-MariaDB-0+deb8u1 - (데비안), 클라이언트: libmysql 5.5.49

둘 다 MyISAM 엔진 상에서 동작합니다.

쿼리:

SELECT id, datum, ordinary FROM (SELECT *, 0 as `ordinary` FROM 
    `user_todolist` WHERE `done` = '0' 
    AND `deleted` = '0' AND `id_uzivatel` = '1' ORDER BY `datum` ASC) AS a1 
UNION 
SELECT id, datum, ordinary FROM (SELECT *, 1 as `ordinary` FROM 
    `user_todolist` WHERE `done` = '1' AND `deleted` = '0' AND 
    `id_uzivatel` = '1' ORDER BY `datum` DESC) AS a2 
ORDER BY `ordinary`

결과(왼쪽 예상, 오른쪽 잘못됨):

여기에 이미지 설명 입력

SQL 설명(상단이 예상됨, 봇이 잘못됨)

여기에 이미지 설명 입력

ORDER BY반드시 안정된 타입은 아닙니다.신청시ORDER BY의 결과로UNION그룹 내에서 순서를 변경할 수 있습니다.

필요없습니다ORDER BY ordinary외부 쿼리로 이동합니다.사용할 때UNION결과는 보통 하위 항목 순서로 나타나기 때문에 첫 번째 항목의 결과는SELECT첫 번째가 될 것이고 두 번째가 될 것이다.SELECT그 후에.

옷을 갈아입어야 한다UNION로.UNION ALL,그래도.디폴트로는UNION DISTINCT즉, 중복을 제거하려면 쿼리 결과를 조합해야 합니다.쿼리 간에 중복이 있을 수 없기 때문에(두 쿼리는 서로 다르기 때문에)ordinarycolumns) 이것은 불필요합니다.

이것에 의존하지 않는 또 다른 솔루션(보증이 되는지는 잘 모르겠습니다)은,ORDER BY datum서브쿼리 중 하나를 사용하여 메인쿼리를 설정합니다.

ORDER by ordinary, IF(ordinary = 0, datum, '') ASC, IF(ordinary = 1, datum, '') DESC
  • ANSI 규격에 따르면ORDER BY서브쿼리에서는 무시할 수 있습니다.이는 표에 행에 고유 순서가 없음을 나타내는 것과 같습니다.
  • 최근 Oracle과 MariaDB(분명히 독립적으로) 모두 이 표준을 활용하기 시작했습니다.
  • UNION ALL값의 중복이 없고, 보다 고속이기 때문에 적절합니다.UNION DISTINCT디커버리 패스가 없기 때문에.
  • UNION는 기존에는 임시 테이블을 작성하고, 1개의 선택 항목에서 행을 입력한 후, 다음 선택 항목으로 이동하는 방식으로 구현되어 왔습니다.
  • 최근에는 특정 상황에서 임시 테이블이 필요하지 않게 되었습니다.이것은 훌륭한 최적화입니다.
  • 미래에는 여러 스레드가 다음 작업을 수행할 것으로 예상됩니다.SELECTs병렬로이렇게 하면 물건이나 주문 방법에 대해 현재 즐길 수 있는 모든 가정이 완전히 무효가 됩니다.

결론:내부 분리ORDER BYs인 것을 덧붙입니다.ORDER BY@Barmar @Barmar bar다다다다다다다barbarbarbarbarbarbarbarbarbar @Barmar?

이렇게 하면 MySQL/MariaDB의 모든 과거, 현재 및 미래 버전에서 쿼리가 '올바르게' 작동합니다.(몇 년 전 이 문제로 인해 처음 작성되었습니다.)여기)

완전히 삭제되기 전에 InnoDB로 전환하십시오.

언급URL : https://stackoverflow.com/questions/42916203/mysql-union-sort-works-unexpected-at-different-server

반응형